2010-04-23 3 views
0

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

 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)); 

ответ

4

Вы пишете полный буфер вывода с каждой записи, даже если 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

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

bos.write(buffer, 0, read)

2

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

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

+0

Да, потоки закрыты в конце блока, но не вставляли его для краткости. Глядя на общедоступность, очень интересно – nkr1pt

Смежные вопросы