2016-06-06 10 views
0

Я работаю над частью проекта. Его довольно большой для новичка, как я. В одном разделе я должен извлечь вложение из электронной почты и сохранить его в системном файле. Но по какой-то причине он занимает слишком много времени. Я использовал этот код для 1-го подхода:Java Inputstream слишком медленный, чтобы читать файл 1.5mb

byte[] buf = new byte[4096]; 
int bytesRead; 
while ((bytesRead = inputStream.read(buf)) != -1) { 
    fileOutputStream.write(buf, 0, bytesRead); 
} 

Этот блок кода занимает около 86 секунд только для файла размером 1,5 Мб. Но когда я пытаюсь запустить этот же код из образца тестового проекта, он завершился за несколько миллисекунд (для этого я взял входной файл системного файла вместо вложения, а затем написал его в другом каталоге). я уже посетил эти страницы: Java: InputStream too slow to read huge files

Input stream reads large files very slowly, why?

Но я не могу найти конкретную причину этого. я пытался отладить его более при таком подходе:

InputStream inputStream = bodyPart.getInputStream(); 
FileOutputStream fileOutputStream = new FileOutputStream(file); 
long tStart = System.currentTimeMillis(); 
byte[] buf = new byte[4096]; 
int bytesRead; 
int i=1; 
while(true) 
{ 
    long tc = System.currentTimeMillis(); 
    bytesRead = inputStream.read(buf); 
    long tc1 = System.currentTimeMillis(); 
    System.out.println("\nRead Time "+i+" ="+(tc1-tc)); 

    if(bytesRead==-1) break; 
    fileOutputStream.write(buf, 0, bytesRead); 

    long tc2 = System.currentTimeMillis(); 
    System.out.println("Write Time "+i+" ="+(tc2-tc1)); 
    i++; 
} 

long tEnd = System.currentTimeMillis(); 
long tDelta = tEnd - tStart; 
System.out.println("\n\nTotal Time="+tDelta+"\n\n"); 

И выход тоже странно. Часть вывода для файла 1.5Mb является:

Read Time 354 =788 
Write Time 354 =0 

Read Time 355 =0 
Write Time 355 =0 

Read Time 356 =0 
Write Time 356 =0 

Read Time 357 =744 
Write Time 357 =0 

Read Time 358 =0 
Write Time 358 =0 

Read Time 359 =0 
Write Time 359 =0 

Read Time 360 =837 
Write Time 360 =0 

Read Time 361 =0 
Write Time 361 =0 

Read Time 362 =1 
Write Time 362 =0 

Read Time 363 =811 
Write Time 363 =0 

Read Time 364 =1 
Write Time 364 =0 

Read Time 365 =0 
Write Time 365 =0 

Read Time 366 =757 
Write Time 366 =0 

Read Time 367 =1 
Write Time 367 =0 

Read Time 368 =0 
Write Time 368 =0 

Read Time 369 =736 
Write Time 369 =0 

Read Time 370 =0 
Write Time 370 =0 

Read Time 371 =0 
Write Time 371 =0 

Read Time 372 =484 
Write Time 372 =0 

Read Time 373 =0 

Total Time=88796 

Здесь, как вы можете видеть время чтения для буфера 4kb занимает довольно много времени после каждого шага 3 или читать. Я не могу определить конкретную проблему. Я также использовал буферизованный входной поток и выходной поток, но результаты одинаковы. Может кто-нибудь помочь мне узнать, в чем проблема?

+1

Эти вложения хранятся на сетевом сервере? Возможно, сетевой сервер реагирует медленно - и вы ничего не можете с этим поделать. –

+0

На самом деле я загрузил приложение прямо над кодом, упомянутым в вопросе. Поэтому я думаю, что это должно быть в памяти jvm. @SvetlinZarev –

+0

Если вы ссылаетесь на 'bodyPart.getInputStream();', то это не в памяти JVM. –

ответ

-1

использовать bufferedinputstream вместо InputStream.

+0

ОП сказал, что он попытался BufferedInputStream –

+0

Я уже сказал в вопросе, что я пытался с buffredInputStream, и результаты одинаковы. –

+1

Я не могу увидеть его в вашем коде! Я просто сказал, что вижу .... – RayanFar