Подтвердить что ты не робот

Как вы определяете, какой размер байта [] используется для InputStream.read()?

При чтении из InputStreams, как вы определяете, какой размер использовать для байта []?

int nRead;
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about

while ((nRead = is.read(data, 0, data.length)) != -1) {
  ...do something..
}

Когда вы используете небольшую по сравнению с большой? Каковы различия? Требуется ли число с шагом 1024? Это имеет значение, если это InputStream из сети и диска?

Спасибо большое, я не могу найти ясный ответ в другом месте.

4b9b3361

Ответ 1

Большинство людей используют полномочия размером 2 для размера. Если буфер составляет не менее 512 байт, это не имеет большого значения (< 20%)

Для сети оптимальный размер может быть от 2 КБ до 8 КБ (размер базового пакета обычно составляет до ~ 1,5 КБ). Для доступа к диску самый быстрый размер может быть от 8 КБ до 64 КБ. Если вы используете 8K или 16K, у вас не будет проблем.

Примечание для сетевых загрузок, скорее всего, вы обнаружите, что обычно не используете весь буфер. Отбросить несколько KB не имеет большого значения для 99% случаев использования.

Ответ 2

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

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

Ответ 3

В этой ситуации я всегда использую разумную мощность 2, где-то в диапазоне от 2K до 16K. В общем, разные InputStreams будут иметь разные оптимальные значения, но нет простого способа определить значение.

Чтобы определить оптимальное значение, вам нужно больше узнать о точном типе InputStream, с которым вы имеете дело, а также о вещах, подобных спецификациям оборудования, обслуживающего InputStream.

Беспокойство об этом, вероятно, связано с преждевременной оптимизацией.

Ответ 4

Используя метод available() в классе InputStream. Из Javadoc:

Возвращает количество байтов, которое может быть прочитано (или пропущено) из этот входной поток без блокировки следующим вызывающим абонентом метода для этот входной поток. Следующий вызывающий объект может быть одним и тем же потоком или другой поток.