2011-02-08 4 views
0

私は一貫して再現できない問題があります。私はファイルを読み、そのファイルの内容をServletOutputStreamに書き出します。ServletOutputStream.writeがインデックスを範囲外にスローします。

     byte[] buff = new byte[65536]; 

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

私は時々OutputStreamに書き込むとき(20KBsより小さい)いくつかのファイルがは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()(バフ、0、bytesRead)を書きます;。

同じファイルでテストしても問題が一貫して報告されない理由はありますか?

答えて

6

inputStream.read(..)-1を返すことができます。 commons-io:のIOUtilsを使用することをお勧めします。記録としては、次のように実装されています。

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

ありがとうBozho。私はあなたのポイントを見ますが、私のログには、出力ストリームに読み書きされるファイルのサイズが表示されます。つまり、ファイルにアクセスできることを意味します。あなたは思いませんか? IOUtils.copyも見ていきます。もう一度ありがとう – user305210

+0

あなたは私のbytearrayが4096を超えてはならないと言っていますか?私の場合は65536ですから?あるいは、私は読み書きを実装する正しい方法を私に見せたいだけでしたか? – user305210

+0

@ user305210これは、Apacheで使うバッファです:)あなたは別のバッファサイズを試すことができます。 – Bozho