ServletOutputStream.write иногда выбрасывает индекс за пределы - PullRequest
0 голосов
/ 08 февраля 2011

У меня проблема, которую я не могу воспроизвести постоянно.Я читаю файл и записываю содержимое этого файла в ServletOutputStream.

                        byte[] buff = new byte[65536];

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

Я заметил, что некоторые файлы (размером менее 20 КБ) иногда выдают 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 Ответ

6 голосов
/ 08 февраля 2011

inputStream.read(..) может вернуть -1.Я бы предложил использовать IOUtils от commons-io: IOUtils.copy(inputStream, outputStream).Для записи это реализовано следующим образом:

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