Intereting Posts

Каков лучший способ получить строку из BufferedReader

Я получаю BufferedReader из следующего сетевого кода.

  URL url = new URL(request); HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection(); InputStream inputStream = httpUrlConnection.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
  1. Мне было интересно, какой путь дает более высокую эффективность с точки зрения скорости выполнения?
  2. Размер 1024 – хороший выбор для Android? Или, есть ли какое-либо системное значение, которое я могу использовать?

      int charRead = 0; char[] buffer = new char[1024]; StringBuffer stringBuffer = new StringBuffer(); while ((charRead = bufferedReader.read(buffer)) > 0) { stringBuffer.append(buffer, 0, charRead); } 

  String line = ""; StringBuffer stringBuffer = new StringBuffer(); while ((line = bufferedReader.readLine()) != null) { stringBuffer.append(line); } 

Я думаю, что первый подход более эффективен, но я предпочел бы установить более высокий размер буфера ex. 8 * 1024. Это значение по умолчанию: CoreConnectionPNames.SOCKET_BUFFER_SIZE в HttpClient. Я бы сказал, что что-то ниже 8 * 1024 неразумно, потому что большинство HTTP-буферов установлены на 8 * 1024.

Во втором подходе вы принимаете новые строковые символы в потоке. Что в случае 20MB json оптимизировано таким образом, что нет новых символов линии? Это приведет к удалению вашего приложения.

Линия считается завершенной любым из строк ('\ n'), возвратом каретки ('\ r') или возвратом каретки, за которым следует сразу строка.

На мой взгляд, лучший выбор – использовать умножение 8 * 1024. Верхнее ограничение связано с размером памяти и скоростью соединения в отношении времени обработки буфера потока.

Использование StringBuilder считается лучшей альтернативой StringBuffer если вам не нужны накладные расходы на использование синхронизированного StringBuffer . ( StringBuilder – это замена)

Что касается производительности, я бы пошел с первым подходом и не использовал readLine() если вам не нужно обрабатывать строку как строку текста. Кроме того, readLine() не возвращает фактические переводы строк, поэтому в данных, которые вы создаете во втором примере, будут отсутствовать переводы строк, и, следовательно, может быть не таким, каким оно было передано с сервера.

Может быть установлен более высокий буферный лимит.

Согласно java doc

Можно указать размер буфера или использовать размер по умолчанию. Значение по умолчанию достаточно велико для большинства целей.

Буферизация – лучший подход. Снова в соответствии с документом

Без буферизации каждый вызов read () или readLine () может привести к чтению байтов из файла, преобразованию в символы и возврату, что может быть очень неэффективным.