ServletOutputStream.write有时会抛出索引越界

时间:2011-02-08 16:40:39

标签: java servlets outputstream

我遇到了一个无法一致重现的问题。我读了一个文件并将该文件的内容写入ServletOutputStream。

                        byte[] buff = new byte[65536];

                        int bytesRead = dataStream.read(buff);
                        response.getOutputStream().write(buff, 0, bytesRead);

我注意到有些文件(小于20KB)在写入输出流时会抛出IndexOutofBoundsException,但在其他时候,一切都可以找到。我的意思是,没有报告IndexOutOfBoundsException。

这是我得到的堆栈跟踪:

java.lang.ArrayIndexOutOfBoundsException
        at java.lang.System.arraycopy(Native Method)
        at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:331)
        at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392)
        at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381)
        at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:88)
        at com.abc.web.DeliverData.serviceRequest(DeliverData.java:101)

我的代码中的第101行是:            response.getOutputStream()。write(buff,0,bytesRead);

为什么即使使用相同的文件进行测试也不能始终如一地报告问题?

1 个答案:

答案 0 :(得分:6)

inputStream.read(..)可以返回-1。我建议使用来自commons-io IOUtils.copy(inputStream, outputStream)的{​​{3}}。记录如下:

byte[] buffer = new byte[4096];
int n = 0;
while (-1 != (n = input.read(buffer))) {
   output.write(buffer, 0, n);
}