2011-02-08 139 views
0

我有一个问题,我不能一致地重现。我读取一个文件并将该文件的内容写入ServletOutputStream。ServletOutputStream.write抛出索引超出范围有时

     byte[] buff = new byte[65536]; 

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

我注意到一些文件(小于20KBs)抛出IndexOutOfBoundsException异常,有时写的OutputStream的时候,但在其他时间,一切工作只要找到。我的意思是,没有报告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()写(BUFF,0,bytesRead)。

即使使用相同文件进行测试,为什么问题没有被一致报告的任何想法?

回答

6

inputStream.read(..)可以返回-1。我建议使用来自commons-io的IOUtilsIOUtils.copy(inputStream, outputStream)。为了记录,其实施如下:

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

感谢Bozho。我看到了你的观点,但在我的日志中,我打印了即将被读取和写入输出流的文件的大小。这意味着该文件是可访问的。你不觉得吗?我也会研究IOUtils.copy。再次感谢 – user305210 2011-02-08 16:54:36