Я сделал небольшую программу для загрузки данных и записи их в файл.Неполный файл с использованием RandomAccessFile в java
Вот код:
public void run()
{
byte[] bytes = new byte[1024];
int bytes_read;
URLConnection urlc = null;
RandomAccessFile raf = null;
InputStream i = null;
try
{
raf = new RandomAccessFile("file1", "rw");
}
catch(Exception e)
{
e.printStackTrace();
return;
}
try
{
urlc = new URL(link).openConnection();
i = urlc.getInputStream();
}
catch(Exception e)
{
e.printStackTrace();
return;
}
while(canDownload())
{
try
{
bytes_read = i.read(bytes);
}
catch(Exception e)
{
e.printStackTrace();
return;
}
if(bytes_read != -1)
{
try
{
raf.write(bytes, 0, bytes_read);
}
catch(Exception e)
{
e.printStackTrace();
return;
}
}
else
{
try
{
i.close();
raf.close();
return;
}
catch(Exception e)
{
e.printStackTrace();
return;
}
}
}
}
Проблема заключается в том, что когда я загрузить большие файлы, я получаю несколько байтов, отсутствующих в конце файла. Я попытался изменить размер байтового массива на 2K, и проблема была решена. Но когда я загрузил более крупный файл (500 МБ), я снова потерял несколько байтов. Я сказал: «Хорошо, давайте попробуем с размером 4K». И я изменил размер байтового массива на 4K. Это сработало! Приятно, но потом я загрузил файл размером 4 ГБ, я снова потерял байты! Я сказал: «Прохладный, давайте попробуем с размером 8К». И затем я изменил размер байтового массива на 8K. Работал.
Мой первый вопрос: почему это происходит? (когда я изменяю размер буфера, файл не повреждается).
Хорошо, теоретически проблема с поврежденным файлом может быть решена путем изменения размера массива байтов на большие значения. Но есть еще одна проблема: как измерить скорость загрузки (за один интервал) с большими размерами байтов?
Например: предположим, что скорость загрузки составляет 2 КБ/с. И размер массива байтов составляет 4 К. Мой второй вопрос: как измерить скорость (за один интервал), если потоку придется ждать, пока массив байтов будет заполнен? Мой ответ должен быть: изменить размер массива байтов на меньшее значение. Но файл будет поврежден xD.
После попытки решить проблему самостоятельно, я потратил 2 дня на поиск через Интернет для решения. И ничего.
Прошу вас, ребята, ответить на мои два вопроса? Благодаря = D
Редактировать
Код для canDownload():
synchronized private boolean canDownload()
{
return can_download;
}
Показать код для 'canDownload()' –
Я добавил к тексту вопроса. – Yuri
Предположим, что ваш размер файла 300 * 2k + 35 байт, вы пропускаете последние 35 байтов? – user1452132