【问题标题】:Java close FileInputStream before reading anythingJava 在读取任何内容之前关闭 FileInputStream
【发布时间】:2017-03-30 16:02:55
【问题描述】:

我有一个非常特殊的问题。在 android 中,我使用 FileInputStream 从串行(ttySx/COM)端口读取。我正在使用它来决定连接了哪些已知设备(如果有的话)。我基本上做的是:

  1. 您是设备 1 吗?不...
  2. 您是设备 2 吗?不...
  3. 你是设备 3 吗?是的...
  4. 太好了,让我们做一些事情......

这很好用。如果有任何传入数据要读取(来自设备的响应),一切都很好。但是,如果没有连接到 ttySx 的设备,则无法响应我的写入。这意味着没有什么可阅读的。

现在,FileInputStream.read() 是一个阻塞调用。当我在线程中调用它时,线程被有效地冻结。我不能打断线程,因为为此我必须先阅读一些内容。到目前为止,一切都很合理。

由于端口在很长一段时间内没有响应,我决定没有任何连接并想停止读取并处理线程(实际上我不想再打扰端口了,因为没有任何连接,它此刻对我没用)。如前所述,中断本身是没有好处的。应该起作用的是close() FileInputStream(read() 会抛出异常,万岁!)。 close() 工作...只要 read() 读过任何东西(比如当我连接了一个应答设备,然后断开它 -> read() 卡住了 - 因为没有数据要读取 - 但 close() 有效)。

但是,如果在 read() 启动时没有任何东西连接到端口(等于:我没有读取单个字节),close() 方法什么都不做。它不会关闭流。 FileInputStream 通道的关闭也不起作用。

我可以创建一个解决方法:将 FileInputStream 存储在某处,稍后当我想再次从端口读取时,使用相同的实例。那对我有用。不幸的是,我会不必要地阻塞端口本身。没有其他进程(例如另一个应用程序)可以从端口读取,因为它卡在“不可中断”读取中......

任何想法为什么会发生这种情况以及如何使它正确?或者其他方法来检测是否有任何东西连接到 ttySx 端口?

谢谢。

EDIT1:用于与串口通信的库是https://github.com/cepr/android-serialport-api

【问题讨论】:

  • 你试过InputStream::available()方法对你有什​​么好处吗?我不确定它是否适用于您的情况,但也许值得一试。另外,真的没有办法打断read() 的通话吗?如果您尝试使用 Future 或类似的内容(这将是我的第一直觉)包装怎么办?
  • 另一个问题:你有没有尝试过同样的情况而不使用 FileInputStream?中断要求是java.nio 中的一个东西,也许从 FileChannel 读取会更好地解决这个问题?
  • @M.Prokhorov:谢谢。是的,我确实尝试过InputStream::available() 。它每次都返回 0。即使有什么要读的。因此完全不可靠。至于 FileChannel -> 有趣的想法。我会试试看。
  • 您为什么不使用为您处理串行端口通信的库?虽然您在技术上可以使用FileInputStream,但还有其他设置需要注意(波特率、停止位等)
  • @rm5248:实际上,据我所知,使用了一些第三方库(我不是实施它的人,也无法查看源代码几天了,因此我不知道它到底是哪个库)。这个 FileInputStream 是那个库的“幕后”行为。您对 android 上的 rs232 通信有任何经验并建议一个特定的库吗?我将不胜感激,并很乐意将其换成旧的:-)。

标签: java android serial-port fileinputstream


【解决方案1】:

最后我们使用了FileInputStream::available()

我们第一次尝试的时候是这样的:

  1. 检查是否有可用的东西。
  2. 阅读(无论是否可用)

当然,当我们检查 available 时,还没有什么可阅读的。然后 read 调用被阻塞并等待输入。当我们再次检查时,已经没有任何可用了,因为read已经清除了端口。

因此,来自 M. Prokhorov 的这个建议 Java close FileInputStream before reading anything 对我的情况来说是正确的。


如果有人想知道有问题的行为: 从研究来看,似乎读取流首先不是为端口/套接字设计的。它是为常规文件设计的。您阅读,到达文档末尾并关闭流。异常是为错误的顺序使用流而设计的(您打开它,关闭 id 然后尝试读取)。 如果您进入阻塞模式,它将阻塞,直到它读取至少一个字节。没有办法解决它。 关闭 初始化“关闭状态”,类似于设置线程的中断状态。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多