Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在读取任何内容之前关闭FileInputStream_Java_Android_Serial Port_Fileinputstream - Fatal编程技术网

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

Java在读取任何内容之前关闭FileInputStream,java,android,serial-port,fileinputstream,Java,Android,Serial Port,Fileinputstream,我有一个非常奇怪的问题。在android中,我使用FileInputStream从串行(ttySx/COM)端口读取数据。我用它来决定连接了哪些已知设备(如果有的话)。我基本上做的是: 你是设备1吗?不 你是设备2吗?不 你是设备3吗?是的 太好了,让我们做些事情 这很有效。若要读取任何传入数据(来自设备的响应),则一切正常。但是,如果没有设备连接到ttySx,则不会对我的写入做出任何响应。那意味着没什么可读的 现在,FileInputStream.read()是一个阻塞调用。当我在线程中调用它

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

  • 你是设备1吗?不
  • 你是设备2吗?不
  • 你是设备3吗?是的
  • 太好了,让我们做些事情
  • 这很有效。若要读取任何传入数据(来自设备的响应),则一切正常。但是,如果没有设备连接到ttySx,则不会对我的写入做出任何响应。那意味着没什么可读的

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

    由于端口在相当长的一段时间内没有响应,我决定没有连接任何东西,并希望停止读取和处理线程(实际上我不想再为端口烦恼,因为没有连接任何东西,此时对我来说是无用的)。如前所述,中断本身是不好的。应该工作的是关闭()FileInputStream(read()将引发异常,万岁!)。close()可以工作。。。只要read()读取任何内容(比如我连接了应答设备,然后断开它的连接->read()就卡住了-因为没有数据要读取-但是close()可以工作)

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

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

    你知道为什么会发生这种情况,以及如何纠正这种情况吗?或者以其他方式检测ttySx端口是否连接了任何东西

    谢谢


    EDIT1:用于与串行端口通信的库是

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

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

  • 检查是否有可用的东西
  • 读取(不考虑可用性)
  • 当然,当我们检查可用的文件时,还没有什么可读的。然后read调用被阻止并等待输入。当我们再次检查时,已经没有可用的内容,因为read已清除端口

    因此,普罗霍罗夫先生的这一建议对我的情况是正确的


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

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

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

  • 检查是否有可用的东西
  • 读取(不考虑可用性)
  • 当然,当我们检查可用的文件时,还没有什么可读的。然后read调用被阻止并等待输入。当我们再次检查时,已经没有可用的内容,因为read已清除端口

    因此,普罗霍罗夫先生的这一建议对我的情况是正确的


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

    如果
    InputStream::available()
    方法对您有用,您是否尝试过?我不太确定它是否适用于你的情况,但也许值得一试。另外,真的没有办法中断
    read()
    调用吗?如果您尝试使用
    未来
    或类似的方式(这将是我的第一直觉)进行包装会怎么样?另一个问题:您是否尝试过完全不使用FileInputStream的相同情况?中断要求是
    java.nio
    中的一项内容,也许从FileChannel读取内容会更有效?@M.Prokhorov:谢谢。是的,我尝试了
    InputStream::available()
    。它每次返回0。即使有什么要读的。因此完全不可靠。至于FileChannel->有趣的想法。我来试试。你为什么不使用一个为你处理串口通信的库呢?虽然从技术上讲,您可以使用
    文件输入流
    ,但还有其他设置需要注意(波特率、停止位等)@rm5248:实际上,据我所知,使用了一些第三方库(我不是实现它的那个人,几天之内我都无法查看源代码,因此我无法确切地说出它是哪个库)。这个FileInputStream的东西是“隐藏的”该库的行为。您是否有在android上进行rs232通信的经验,并建议使用特定的库?我将非常感激,并很高兴将其切换为旧库:-)。如果