Java在读取任何内容之前关闭FileInputStream
我有一个非常奇怪的问题。在android中,我使用FileInputStream从串行(ttySx/COM)端口读取数据。我用它来决定连接了哪些已知设备(如果有的话)。我基本上做的是:Java在读取任何内容之前关闭FileInputStream,java,android,serial-port,fileinputstream,Java,Android,Serial Port,Fileinputstream,我有一个非常奇怪的问题。在android中,我使用FileInputStream从串行(ttySx/COM)端口读取数据。我用它来决定连接了哪些已知设备(如果有的话)。我基本上做的是: 你是设备1吗?不 你是设备2吗?不 你是设备3吗?是的 太好了,让我们做些事情 这很有效。若要读取任何传入数据(来自设备的响应),则一切正常。但是,如果没有设备连接到ttySx,则不会对我的写入做出任何响应。那意味着没什么可读的 现在,FileInputStream.read()是一个阻塞调用。当我在线程中调用它
EDIT1:用于与串行端口通信的库是,最后我们使用了
FileInputStream::available()
我们第一次尝试时,感觉就像:
如果有人想知道有问题的行为: 通过研究,似乎读取流最初不是为端口/套接字设计的。它是为普通文件设计的。阅读,到达文档末尾并关闭流。这些异常是针对流的错误顺序使用而设计的(您打开它,关闭id,然后尝试读取)。
如果进入阻塞模式,它将阻塞,直到读取至少一个字节。没办法。Close初始化“closing state”,类似于设置线程的中断状态。最后我们使用了
FileInputStream::available()
我们第一次尝试时,感觉就像:
如果有人想知道有问题的行为: 通过研究,似乎读取流最初不是为端口/套接字设计的。它是为普通文件设计的。阅读,到达文档末尾并关闭流。这些异常是针对流的错误顺序使用而设计的(您打开它,关闭id,然后尝试读取)。
如果进入阻塞模式,它将阻塞,直到读取至少一个字节。没办法。Close初始化“closing state”类似于设置线程的中断状态。如果
InputStream::available()
方法对您有用,您是否尝试过?我不太确定它是否适用于你的情况,但也许值得一试。另外,真的没有办法中断read()
调用吗?如果您尝试使用未来
或类似的方式(这将是我的第一直觉)进行包装会怎么样?另一个问题:您是否尝试过完全不使用FileInputStream的相同情况?中断要求是java.nio
中的一项内容,也许从FileChannel读取内容会更有效?@M.Prokhorov:谢谢。是的,我尝试了InputStream::available()
。它每次返回0。即使有什么要读的。因此完全不可靠。至于FileChannel->有趣的想法。我来试试。你为什么不使用一个为你处理串口通信的库呢?虽然从技术上讲,您可以使用文件输入流
,但还有其他设置需要注意(波特率、停止位等)@rm5248:实际上,据我所知,使用了一些第三方库(我不是实现它的那个人,几天之内我都无法查看源代码,因此我无法确切地说出它是哪个库)。这个FileInputStream的东西是“隐藏的”该库的行为。您是否有在android上进行rs232通信的经验,并建议使用特定的库?我将非常感激,并很高兴将其切换为旧库:-)。如果