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

java.io.IOException:流关闭或底层输入流在从request.getInputStream()读取字符时返回零字节,java,tomcat,exception,servlets,Java,Tomcat,Exception,Servlets,我有一个Servlet,它的请求比率大约为10000个请求/小时 其中,我经常在同一行中遇到这两个异常中的一个,大约每天5到6次,但不是每次调用这个Servlet时 java.io.IOException: Stream closed at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312) at org.apache.catalina.connector.CoyoteInputStream.r

我有一个Servlet,它的请求比率大约为10000个请求/小时

其中,我经常在同一行中遇到这两个异常中的一个,大约每天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)

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

这是我的密码:

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();
注意:流在代码末尾正确关闭


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

我遇到了一个类似于此的错误,我收到了一个“java.io.IOException:Stream closed”(ServletException)。 在分别测试了服务的每个部分之后,我意识到POST方法不知何故让我得到了错误。我替换了一个GET方法,错误消失了。 情况也很相似,偶尔会出错(比如对于30秒的延迟请求,一小时内会出错4-5次)。
现在,几天后,我再也没有看到它了。

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

代码中没有bug。它主要发生在客户端
关闭
/
断开
连接或网络
中断
/
慢度
无法控制时


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

流已关闭。你关了吗?不,这不是问题。关闭流是正确处理的,在所有进程结束时都会调用。这就是为什么我特别提到,我每天只收到5到6次异常,不是针对所有请求。是否可能有另一个线程正在访问同一个InputStream?否。我发布的代码是简单servlet(不是异步)的开始部分我尝试获取与请求绑定的post数据。在获得有效的
有效负载后,它将被进一步处理,但在此之前,我在读取数据时遇到了此异常。很可能是客户端关闭/断开了连接。网络中断时有发生。
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();