Java: проблема с загрузкой с использованием BufferedInputStream, BufferedOutputStream - PullRequest
0 голосов
/ 23 апреля 2010

При загрузке rar-файла из Интернета с кодом ниже, загруженный файл больше, чем есть на самом деле. Не уверен, что вызывает это?

        bis = new BufferedInputStream(urlConn.getInputStream());
        bos = new BufferedOutputStream(new FileOutputStream(outputFile));

        eventBus.fireEvent(this, new DownloadStartedEvent(item));

        int read;
        byte[] buffer = new byte[2048];
        while ((read = bis.read(buffer)) != -1) {
            bos.write(buffer);
        }

        eventBus.fireEvent(this, new DownloadCompletedEvent(item));

Ответы [ 3 ]

4 голосов
/ 23 апреля 2010

Вы записываете полный буфер в вывод при каждой записи, даже если операция read(byte[]) не заполнила его полностью.

Кроме того, поскольку вы уже читаете в byte[], буферизованные потоки являются просто непроизводительными издержками. Используйте буферизованные потоки с однобайтовыми методами read() и write().

Вот лучший пример для подражания.

InputStream is = urlConn.getInputStream();
try {
  FileOutputStream os = new FileOutputStream(outputFile);
  try {
    byte[] buffer = new byte[2048];
    while (true) {
      int n = is.read(buffer);
      if (n < 0)
        break;
      os.write(buffer, 0, n);
    }
    os.flush();
  } finally {
    os.close();
  }
} finally {
  is.close();
}
2 голосов
/ 23 апреля 2010

Не изобретайте велосипед: используйте библиотеку Jakarta Commons IO , в которой уже реализован (и отлажен!) Этот код. В частности, посмотрите на IOUtils.copy ()

О да, как показывает erickson , вам необходимо закрыть свои потоки после их использования. IOUtils также имеет метод для этого.

2 голосов
/ 23 апреля 2010

Попробуйте использовать вызов записи BufferedOutputStream, который занимает длину

bos.write(buffer, 0, read)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...