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

标签 java android serial-port fileinputstream

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

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

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

现在,FileInputStream.read() 是一个阻塞调用。当我在线程中调用它时,线程实际上被卡住了。我不能打断线程,因为为此我必须先读一些东西。到目前为止,一切都很合理。

由于端口很长一段时间没有响应,我决定没有任何连接,并想停止读取并处理线程(实际上我不想再打扰端口了,因为没有任何连接,此时对我来说毫无用处)。正如前面提到的,中断本身并没有什么好处。应该有效的是 close() FileInputStream(read() 将抛出异常,万岁!)。 close() 有效...只要 read() 读取过任何内容(例如当我连接了应答设备,然后断开它 -> read() 被卡住 - 因为没有数据可读取 - 但 close() 有效)。

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

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

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

谢谢。

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

最佳答案

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

我们第一次尝试时,感觉是这样的:

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

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

因此这个建议Java close FileInputStream before reading anything M. Prokhorov 的内容适合我的情况。

<小时/>

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

关于Java 在读取任何内容之前关闭 FileInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122914/

相关文章:

Java数学转换

Java not a statement error at i < j

java - Guava 多重速率限制器

java - AsyncTask 执行但只是有时执行

android - intellij 在 android xml 文件中说 "cannot find declaration to go to"

Android检测一个 Activity 是否在历史堆栈的顶部

bluetooth - 如何在处理中设置串行通信到/dev/rfcomm0

java - Android widget listview 处理点击

c++ - 串口打开返回EAGAIN

serial-port - 可靠的全双工串行通信