`
soboer
  • 浏览: 1309951 次
文章分类
社区版块
存档分类
最新评论

重现java.io.IOException: Stream closed异常

 
阅读更多
上午,美国的QA报告了一个的异常:

Caused by: java.io.IOException: Stream closed
at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:235)
at ........

这个异常发生在从某一个input stream流读取信息的时候发生的。在我们目前的系统中出现这个异常是比较不正常,特别是这个异常并不是很容易重现。我和本地的QA都没有重现出来。

虽然不能重现bug,但是凭借经验来说,这个异常是发生在这样一种场景之下:多个线程索引同一个input stream,当某一个thread在执行完之后,把这个inputstream关闭了;而此时正在从这个input stream流中读取信息的线程就会抛出java.io.IOException: Stream closed 异常。

我写了一小段测试程序,模拟这个场景,如下:

publicclassIOTest...{
publicstaticvoidmain(String[]args)...{
Filef
=newFile("c:/test/StoreTest-1.xml");
java.io.BufferedReaderbr
=null;
try...{
br
=newjava.io.BufferedReader(newjava.io.FileReader(f));
}
catch(FileNotFoundExceptione)...{}

finaljava.io.BufferedReaderbr1=br;
finaljava.io.BufferedReaderbr2=br;

Threadt
=newThread()...{
publicvoidrun()...{
try...{
for(Stringline=null;(line=br1.readLine())!=null;)...{
System.out.println(
"Processstdout:");
try...{
Thread.sleep(
1000);
}
catch(InterruptedExceptione)...{}
}

}
catch(IOExceptionioe)...{
ioe.printStackTrace();
}

}

}
;

Threadt2
=newThread()...{
publicvoidrun()...{
try...{
for(Stringline=null;(line=br2.readLine())!=null;)...{}
System.out.println(
"Processstdout2:");
br2.close();
}
catch(IOExceptionioe)...{
ioe.printStackTrace();
}

}

}
;

t.start();
t2.start();
}

}

当执行这段程序之后,会看到如下输出:
Process stdout:
Process stdout2:
java.io.IOException: Stream closed
at java.io.BufferedReader.ensureOpen(BufferedReader.java:97)
at java.io.BufferedReader.readLine(BufferedReader.java:293)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at test.common.util.IOTest$1.run(IOTest.java:38)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics