2016-09-09 5 views
0

Я пробовал один и тот же файл с браузером Opera и кодом Java.Скачивание файла происходит так медленно

Opera Browser дает скорость почти 2 МБ/с, но код Java дает не более 400 КБ/с. Что случилось с моим кодом?

Я думаю, что я делаю это неправильно с чтением с помощью BufferedReader, но я понятия не имею, почему это происходит и как я могу исправить.

PS: Я только тестирую скорость, не запускаю файл. Я знаю, что это двоичный файл, это имеет значение на скорости?

  StringBuilder builder = new StringBuilder(); 
      HttpURLConnection uri = (HttpURLConnection) new URL("http://speedtest.tele2.net/3MB.zip").openConnection(); 
      uri.setRequestMethod("GET"); 
      uri.setConnectTimeout(5000); 
      InputStream ent = uri.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(ent, "iso-8859-1"), 8); 
      while ((line = reader.readLine()) != null) { 
       builder.append(line + "\n"); 
      } 
+0

Вы можете прочитать файл в около 100 Мб/с с BufferedReader, я бы больше беспокоиться о чтении бинарный файл как текст, который не будет работать. Вы должны прочитать его как двоичный. –

+0

@PeterLawrey это только для speedtesting, а не для бега, так что я думаю, что это нормально делать? –

+1

@ AlperÖzdemir не очень, BufferedReader должен работать, чтобы искать новые строки в прочитанных данных. Выполнение бинарной передачи наиболее определенно более характерно для того, что Opera будет делать под капотом. Кроме того, вы можете просто засунуть больше данных за один раз, считая, например, 4k или 8k за раз. – Gimby

ответ

2

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

public class DownloadMain { 
    public static void main(String[] args) throws IOException { 
     HttpURLConnection uri = (HttpURLConnection) new URL("http://speedtest.tele2.net/3MB.zip").openConnection(); 
     uri.setRequestMethod("GET"); 
     uri.setConnectTimeout(5000); 
     InputStream ent = uri.getInputStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] bytes = new byte[8192]; 
     long start = System.currentTimeMillis(); 
     for (int len; (len = ent.read(bytes)) > 0;) 
      baos.write(bytes, 0, len); 
     long time = System.currentTimeMillis() - start; 
     System.out.printf("Took %.3f seconds to read %.3f MB of data%n", 
       time/1e3, baos.toByteArray().length/1e6); 
    } 
} 

отпечатки

Took 0.541 seconds to read 3.146 MB of data 

который почти 6 МБ/с

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

public class DownloadMain { 
    public static void main(String[] args) throws IOException { 
     HttpURLConnection uri = (HttpURLConnection) new URL("http://speedtest.tele2.net/3MB.zip").openConnection(); 
     uri.setRequestMethod("GET"); 
     uri.setConnectTimeout(5000); 
     InputStream ent =uri.getInputStream(); 
     Reader reader = new InputStreamReader(ent, StandardCharsets.ISO_8859_1); 
     StringWriter sw = new StringWriter(); 
     char[] chars = new char[8192]; 
     long start = System.currentTimeMillis(); 
     for (int len; (len = reader.read(chars)) > 0;) 
      sw.write(chars, 0, len); 
     long time = System.currentTimeMillis() - start; 
     System.out.printf("Took %.3f seconds to read %.3f MB of data%n", 
       time/1e3, sw.toString().length()/1e6); 
    } 
} 

печатает

Took 0.548 seconds to read 3.146 MB of data 

Так это может быть немного медленнее, или просто случайное изменение.

сравнения, используя StringBuilder и чтение одной строки в то время, может быть медленнее, но не резко

Took 0.555 seconds to read 3.146 MB of data 
+0

Спасибо, что решил! –

+1

@ AlperÖzdemir Я добавил тест, используя ваш оригинальный цикл, и он был только немного медленнее. –

Смежные вопросы