Файл загрузки с сервлетом Tomcat загружен не полностью

У меня есть сервлет, который загружает файлы запрошенному клиенту. Теперь, когда пользователь запрашивает загрузку xml-файла. Он начнет загрузку, и когда он завершится, файл будет выглядеть неполным. В конце файла отсутствуют некоторые данные.

Мой код выглядит так:

File file = new File(location);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=" + fileName);

FileInputStream fileIn = new FileInputStream(file);
OutputStream out = response.getOutputStream();

byte[] outputByte = new byte[4096];
int length = -1;

//copy binary contect to output stream
while((length = fileIn.read(outputByte)) > 0)
{
    out.write(outputByte);
}

fileIn.close();
out.flush();
out.close();

Где мой код не может загрузить полный XML-файл?


person JimmyD    schedule 28.06.2017    source источник


Ответы (1)


Измените цикл while следующим образом. Размер буфера равен 4096. Вы должны использовать только ту длину, которая была прочитана в предыдущем read().

  //copy binary contect to output stream
  while((length = fileIn.read(outputByte)) > 0)
  {
     fileOut.write(outputByte, 0, length);
  }

Однако вам следует использовать использование Guava ByteStreams для этого. Вы можете найти другие библиотеки, также поддерживающие это.

person Ramesh PVK    schedule 28.06.2017
comment
не могли бы вы пояснить, почему мы должны использовать write(byte[] b, int off, int len) вместо write(byte[] b). в документах Java упоминается, что общий контракт для write(b) заключается в том, что он должен иметь точно такой же эффект, как и вызов write(b, 0, b.length). - person Bharat; 11.12.2018
comment
Да, оба одинаковы. - person Ramesh PVK; 25.01.2019