Android 关闭 FileInputStream
Android close FileInputStream
我在 Android java 的线程中使用 FileInputStream 来读取串行接口文件。 stream.read(buffer) 如果现在没有数据等待,则阻塞,如果新数据再次进来则继续。数据时不时地到达,只要有东西进入线程就会继续 运行。那很完美!
但是当我想终止线程时,我似乎偶然发现了一个已知已久的错误。 thread.interrupt() 不会取消 stream.read()。
对此有很多疑问。唯一应该起作用的是关闭底层流。但是如果我在我的接收器线程中关闭我的 FileInputStream stream.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
}
睡眠持续时间是在不一直循环和在可接受的时间间隔内获取数据之间的权衡。 Mainthread 以
终止它
stream.close(); // which has no effect to the thread but is clean
thread.interrupt();
我想您对那个阻塞的 read
操作无能为力。尝试 available
在阅读前检查是否有可用数据。
while(!isInterrupted()) {
int len = 0;
if(len = inputStream.available() > 0)
// read your data
}
这是另一个选项:How to stop a thread waiting in a blocking read operation in Java?
我在 Android java 的线程中使用 FileInputStream 来读取串行接口文件。 stream.read(buffer) 如果现在没有数据等待,则阻塞,如果新数据再次进来则继续。数据时不时地到达,只要有东西进入线程就会继续 运行。那很完美!
但是当我想终止线程时,我似乎偶然发现了一个已知已久的错误。 thread.interrupt() 不会取消 stream.read()。
对此有很多疑问。唯一应该起作用的是关闭底层流。但是如果我在我的接收器线程中关闭我的 FileInputStream stream.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
}
睡眠持续时间是在不一直循环和在可接受的时间间隔内获取数据之间的权衡。 Mainthread 以
终止它stream.close(); // which has no effect to the thread but is clean
thread.interrupt();
我想您对那个阻塞的 read
操作无能为力。尝试 available
在阅读前检查是否有可用数据。
while(!isInterrupted()) {
int len = 0;
if(len = inputStream.available() > 0)
// read your data
}
这是另一个选项:How to stop a thread waiting in a blocking read operation in Java?