一、close 顺序异常
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream("tst.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, 1024);
try {
// 错误顺序,可能出现java.io.IOException:stream closed异常
inputStream.close();
bufferedInputStream.close();
// 正确顺序应该为
bufferedInputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
二、文件输入流和缓存流不在同一个线程
public class MyTestClass {
FileInputStream mInputStream;
public MyTestClass() {
try {
mInputStream = new FileInputStream("test.h264");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
BufferedInputStream bufferedInputStream = new BufferedInputStream(mInputStream, 1024);
byte[] buffer = new byte[1024];
try {
// 调用read接口时可能出现java.io.IOException:stream closed异常
// 这是由于bufferedInputStream是在子线程中定义的,而mInputStream是在主线程中定义的
int len = bufferedInputStream.read(buffer, 0, 1024);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
应该更改为:
public class MyTestClass {
public MyTestClass() {
new Thread(new Runnable() {
FileInputStream mInputStream;
@Override
public void run() {
try {
mInputStream = new FileInputStream("test.h264");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedInputStream bufferedInputStream = new BufferedInputStream(mInputStream, 1024);
byte[] buffer = new byte[1024];
try {
int len = bufferedInputStream.read(buffer, 0, 1024);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
本文详细探讨了Java中`java.io.IOException: stream closed`异常的两个常见原因:关闭流的顺序错误以及文件输入流和缓存流在不同线程中的使用。为了解决这个问题,建议调整流的关闭顺序,并确保在同一线程内处理相关流对象。
4172

被折叠的 条评论
为什么被折叠?



