Я встречаюсь со сценарием вроде этого.Загрузить большой файл слишком медленно
Мой проект получает запрос на загрузку из Perl
void downloadRequest(FileItemIterator items,
HttpServletResponse response) throws Exception
{
log.info("Start downloadRequest.......");
OutputStream os = response.getOutputStream();
File file = new File("D:\\clip.mp4");
FileInputStream fileIn = new FileInputStream(file);
//while ((datablock = dataOutputStreamServiceImpl.readBlock()) != null)
byte[] outputByte = new byte[ONE_MEGABYE];
while (fileIn.read(outputByte) != -1)
{
System.out.println("--------" + (i = i + 1) + "--------");
System.out.println(new Date());
//dataContent = datablock.getContent();
System.out.println("Start write " + new Date());
os.write(outputByte);
System.out.println("End write " + new Date());
//System.out.println("----------------------");
}
os.close();
}
}
Я стараюсь читать и писать блоки 1Мб из файла. Однако загрузка всего файла занимает слишком много времени. (Мой случай 20mins для файла 100MB)
Я стараюсь SYSOUT, и я увидел результат, как этот:
Первые несколько блоков могут читать, записывать данные действительно быстро:
--------1--------
Mon Dec 07 16:24:20 ICT 2015
Start write Mon Dec 07 16:24:20 ICT 2015
End write Mon Dec 07 16:24:21 ICT 2015
--------2--------
Mon Dec 07 16:24:21 ICT 2015
Start write Mon Dec 07 16:24:21 ICT 2015
End write Mon Dec 07 16:24:21 ICT 2015
--------3--------
Mon Dec 07 16:24:21 ICT 2015
Start write Mon Dec 07 16:24:21 ICT 2015
End write Mon Dec 07 16:24:21 ICT 2015
Но следующий блок медленнее, чем предыдущий
--------72--------
Mon Dec 07 16:29:22 ICT 2015
Start write Mon Dec 07 16:29:22 ICT 2015
End write Mon Dec 07 16:29:29 ICT 2015
--------73--------
Mon Dec 07 16:29:29 ICT 2015
Start write Mon Dec 07 16:29:29 ICT 2015
End write Mon Dec 07 16:29:37 ICT 2015
--------124--------
Mon Dec 07 16:38:22 ICT 2015
Start write Mon Dec 07 16:38:22 ICT 2015
End write Mon Dec 07 16:38:35 ICT 2015
--------125--------
Mon Dec 07 16:38:35 ICT 2015
Start write Mon Dec 07 16:38:35 ICT 2015
End write Mon Dec 07 16:38:48 ICT 2015
Я действительно не могу понять, как OutputStream писать, почему это займет так много времени, как это? или я допустил некоторые ошибки?
Извините за мой плохой английский. Я действительно нуждаюсь в вашей поддержке. Заранее спасибо!
Промывает ли поток после каждого изменения записи? – Berger
Нет никакой гарантии, что метод 'read (...)' заполнит массив 'outputByte', также вы должны проверить'! = -1' вместо '! = 1'. – Titus
@Berger Я уже пытаюсь очистить каждую запись, но результат тот же – MCT