2015-12-07 5 views
0

Я встречаюсь со сценарием вроде этого.Загрузить большой файл слишком медленно

Мой проект получает запрос на загрузку из 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 писать, почему это займет так много времени, как это? или я допустил некоторые ошибки?

Извините за мой плохой английский. Я действительно нуждаюсь в вашей поддержке. Заранее спасибо!

+0

Промывает ли поток после каждого изменения записи? – Berger

+0

Нет никакой гарантии, что метод 'read (...)' заполнит массив 'outputByte', также вы должны проверить'! = -1' вместо '! = 1'. – Titus

+0

@Berger Я уже пытаюсь очистить каждую запись, но результат тот же – MCT

ответ

0

Невозможно гарантировать, что метод read(byte[] b) будет читать b.length количество байтов из файла, что означает, что ваш код может отправлять больше байтов, чем на самом деле.

Например, если вы обрабатываете файл размером 10 МБ, а read(byte[] b) всегда читает b.length/2 из файла, вы будете отправлять 20 МБ.

Чтобы решить эту проблему, вы можете сделать что-то подобное.

byte[] outputByte = new byte[ONE_MEGABYE]; 
int r = -1; 
while ((r = fileIn.read(outputByte)) != -1){    
     os.write(outputByte,0,r);    
} 

Это гарантирует, что вы будете отправлять только столько байтов, сколько было прочитано из файла.

Помимо этой проблемы, на скорость может влиять множество других факторов, таких как скорость интернета или реализация другой программы.

+0

спасибо, что хороший момент, но производительность все тот же. О сети все сейчас на моем месте, у вас есть другая идея? :( – MCT

+0

@MCT попытаться изменить размер буфера [здесь вы можете найти дополнительную информацию об этом] (http://stackoverflow.com/questions/236861/how-do-you-determine-the- ideal-buffer-size-when-use-fileinputstream), вы также должны использовать буферизованные потоки, такие как «BufferedInputStream» и «BufferedOutputStream». – Titus