java.io.IOException:流关闭或底层输入流返回零字节,同时从request.getInputStream()读取字符

时间:2014-08-06 15:55:49

标签: java tomcat exception servlets

我有一个Servlet,其请求率约为10,000请求/小时。

其中,我经常在同一行中得到这两个异常中的一个,每天约5到6次但不是每次调用这个Servlet时都会这样。

java.io.IOException: Stream closed
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312)
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.read1(BufferedReader.java:205)
    at java.io.BufferedReader.read(BufferedReader.java:279)

java.io.IOException: Underlying input stream returned zero bytes
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:287)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:154)
        at java.io.BufferedReader.read1(BufferedReader.java:205)
        at java.io.BufferedReader.read(BufferedReader.java:279)

这两个异常都发生在同一条线上。我不知道为什么? 相同类型的所有请求都已完成并成功响应。

这是我的代码:

InputStream ist = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(ist));
StringBuffer sb = new StringBuffer();
char[] c = new char[1];
while(in.read(c, 0, 1) == 1)  // Getting exception at this line
{
    sb.append(c[0]);
}
String payload = sb.toString();

注意:代码末尾的流已正确关闭。

是因为要求比率高吗?如果您有任何解决方案/建议,请给出解决方案/建议。

2 个答案:

答案 0 :(得分:1)

正如@jtahlborn在评论中正确提到的那样,

代码中没有错误。它主要发生在客户端closed / broke连接或您无法控制的网络interruption / slowness时。

幸运的是,我再也没遇到过这个错误。

答案 1 :(得分:0)

我遇到了类似于这个的错误,我收到了'java.io.IOException:Stream closed'(ServletException)。 在分别测试服务的每个部分之后,我意识到POST方法不知何故让我犯了错误。我替换了GET方法,错误消失了。 情况类似,一次进入错误(如同30秒延迟请求,每小时4-5次)。 现在,经过几天,我还没有看到它。