Java 在读取任何内容之前关闭 FileInputStream

Java close FileInputStream before reading anything

我有一个非常奇怪的问题。在 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 存储在某个地方,当我想稍后再次从端口读取时,使用相同的实例。那对我有用。不幸的是,我会不必要地阻塞端口本身。没有其他进程(例如另一个应用程序)可以从端口读取,因为它卡在 "uninterruptable" read...

知道为什么会发生这种情况以及如何纠正吗?或者其他一些方法来检测是否有任何东西连接到 ttySx 端口?

谢谢。

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

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

我们第一次尝试时,感觉就像:

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

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

因此,M. Prokhorov 的这个建议 对我的情况来说是正确的。


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