Как сделать загрузчик в Java - PullRequest
0 голосов
/ 10 мая 2018

Я делаю загрузчик в Java для загрузки небольших и больших файлов.

Моя логика для загрузки файлов следующая

  URL url=new URL(urlToGetFile);
                int count=-1; //this is for counter
                int offset=0;
                BufferedInputStream bufferedInputStream=new BufferedInputStream(url.openStream()); 
                FileOutputStream fileOutputStream=new FileOutputStream(FinalFilePath);


                byte data[] = new byte[1024];  



                while(  ((count=bufferedInputStream.read(data,0,1024))!=-1) )
                                         {
                        fileOutputStream.write(data,0, 1024);
                         }              
                bufferedInputStream.close();
                fileOutputStream.close();
                PrintLine("File has download");

И работает только для небольших файлов , но при загрузке больших файлов загружаются , но они повреждены .

Прочитав много вопросов, я также немного запутался, почему все кодируют fileOutputStream.write (data, 0, 1024); , чтобы сделать смещением до 0 и таким же со смещением для bufferedInputStream.

Я также хочу знать, как изменить это смещение для BufferedInputStream и для FileOutputStream. При получении байтов в цикле.

1 Ответ

0 голосов
/ 10 мая 2018

Вам нужно write прочитанное количество.

Когда вы читаете в буфер, вы можете прочитать менее 1024 байтов. Например, 1200-байтовый файл будет читаться как 1024 + 176. Ваша переменная count хранит, сколько фактически было прочитано, что будет 176 во второй раз вокруг вашего цикла.

Причиной повреждения является то, что вы записали бы 176 «хороших» байтов плюс (1024–176 = 848) дополнительных байтов, которые все еще были в массиве data из предыдущего чтения.

Так что попробуйте:

while( ((count=bufferedInputStream.read(data,0,1024))!=-1) )
{
    fileOutputStream.write(data,0, count);
}  

Нулевое смещение в этом вызове записи - это смещение в data, которое вы действительно хотите установить равным нулю. См. Javadoc для деталей. Для других типов потоков разницы нет.

...