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

时间:2017-03-30 16:02:56

标签: java android serial-port fileinputstream

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

  1. 你是设备1吗?不...
  2. 你是设备2吗?不...
  3. 你是设备3吗?是的......
  4. 很棒,让我们做一些事......
  5. 这很有效。如果有任何要传入的数据(来自设备的响应),一切都很好。但是,如果没有设备连接到ttySx,则没有任何内容可以响应我的写入。这意味着无需阅读。

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

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

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

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

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

    感谢。

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

1 个答案:

答案 0 :(得分:0)

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

我们第一次尝试它,就像是:

  1. 检查是否有可用的东西。
  2. 阅读(无论可用性如何)
  3. 当然,当我们检查 available 时,还没有什么可读的。然后读取调用被阻止并等待输入。当我们再次检查时,没有任何可用,因为 read 已经清除了端口。

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

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