Android close FileInputStream

Android close FileInputStream,android,multithreading,blocking,Android,Multithreading,Blocking,我在Android java的线程中使用FileInputStream来读取串行接口文件。如果现在没有数据等待,如果新数据再次进入,则stream.read(buffer)块将继续。每当线程中有东西继续运行时,数据就会时不时地到达。太好了 但当我想终止线程时,似乎我偶然发现了一个众所周知的bug。thread.interrupt()不会取消stream.read()。 关于这一点有很多问题。唯一有效的方法是关闭底层流。但是如果我关闭我的接收线程中的FileInputStream.read(),它

我在Android java的线程中使用FileInputStream来读取串行接口文件。如果现在没有数据等待,如果新数据再次进入,则stream.read(buffer)块将继续。每当线程中有东西继续运行时,数据就会时不时地到达。太好了

但当我想终止线程时,似乎我偶然发现了一个众所周知的bug。thread.interrupt()不会取消stream.read()。
关于这一点有很多问题。唯一有效的方法是关闭底层流。但是如果我关闭我的接收线程中的FileInputStream.read(),它仍然会一直等待。它只有在接收到下一组数据后才会停止——当然,这会走错方向

我还可以做些什么来真正关闭或关闭FileInputStream

编辑
经过讨论,我的解决方案是这样的。这不是最好的性能,使用了文档中未建议的available(),但它可以工作

侦听文件的线程:

byte[] buffer = new byte[1024];
while (!isInterrupted())
{
  if (stream.available() == 0)
  {
    Thread.sleep(200);
    continue;
  }

  // now read only executes if there is something to read, it will not block indefinitely.
  // let's hope available() always returns > 0 if there is something to read.
  int size = stream.read(buffer);

  now do whatever you want with buffer, then repeat the while loop
}
睡眠时间是在不一直循环和在可接受的时间间隔内获取数据之间的折衷。主线程以

stream.close(); // which has no effect to the thread but is clean
thread.interrupt();

我猜你对阻塞
read
操作无能为力。在读取之前,请尝试使用
可用
检查是否有可用数据

while(!isInterrupted()) {
   int len = 0;
   if(len = inputStream.available() > 0)  
   // read your data
}

这里还有另一个选项:

我想你对阻塞
读取操作无能为力。在读取之前,请尝试使用
可用
检查是否有可用数据

while(!isInterrupted()) {
   int len = 0;
   if(len = inputStream.available() > 0)  
   // read your data
}

这里还有另一个选项:

你能发布那块代码吗?线程是
而(!isInterrupted()){int size=inputStream.read(buffer);…进程缓冲区}
主线程是:inputStream.close()<代码>读取
有IOException。你抓到这个了吗?通过显示更多源代码来提供更多信息。是的,我捕获了while循环中的异常。未输入catch子句。当close()之后的数据进入旧线程时,读取后的行(processbuffer)会在旧线程中执行,因此我可以清楚地说没有这种异常。没有更相关的代码:-)我对缓冲区所做的事情是可以的,关闭流的调用就是这一行。断点告诉我旧线程在read()之后真的继续运行,而(!isInterrupted())则没有异常。请检查下面我的更新答案。你能发布那段代码吗?线程是
while(!isInterrupted()){int size=inputStream.read(buffer);…进程缓冲区}
主线程是:inputStream.close();
read
有IOException。您正在捕获它吗?通过显示更多的源代码来提供更多信息。是的,我捕获了while循环周围的异常。未输入catch子句。当数据在close()之后进入时,读取后的行(“进程缓冲区”内容)将在旧线程中执行,所以我可以清楚地说没有这样的例外。没有更多相关的代码:-)我对缓冲区所做的事情都是可以的,关闭流的调用就是这一行。断点告诉我,旧线程在read()之后确实继续运行,而(!isInterrupted())则没有异常。请检查我下面更新的答案。好的,谢谢你确认我的担心,至少我可以停止搜索:-)我在带sleep的循环中检查可用的()。available()被证明是不可靠的,而繁忙的等待也不好。但是显然没有别的办法。一旦你找到了最好的解决方案,请把它贴在这里。我很想知道解决办法。我也这么做了,看原始的postOk谢谢你确认我的恐惧,至少我可以停止搜索:-)我在睡眠循环中检查可用的()。available()被证明是不可靠的,而繁忙的等待也不好。但是显然没有别的办法。一旦你找到了最好的解决方案,请把它贴在这里。我很想知道解决办法。泰,我也看到了,原来的帖子