Если вы спрашиваете, какой из этих классов является самым быстрым или использует наименьшее количество памяти в общем , то ответа нет. Это критически зависит от задачи, которую вы выполняете. А как вы используете классы.
Если вы запрашиваете самый быстрый способ просто подсчитать строки в файле, то самым быстрым способом будет использование InputStream
для чтения непосредственно в ByteBuffer
, а затем подсчитайте строку терминаторы. Это также будет использовать наименьшее количество памяти.
И вот почему:
- Все, что генерирует
String
для каждой прочитанной строки, будет выполнять много ненужного копирования и создавать много мусора.
- Все, что использует
Reader
, будет выполнять декодирование байтовых данных в символьные данные. Это включает в себя LineNumberReader
- Если вы используете
BufferedInputStream
и читаете большой byte[]
, вы фактически делаете свою собственную (простую) буферизацию. Вы также можете использовать InputStream
напрямую.
- Если вы используете
read(byte[])
, вы делаете дополнительную копию данных в byte[]
.
Существует ряд руководств, которые помогут вам понять, как использовать ByteBuffer
для быстрого ввода-вывода. Например:
- Страница учебного пособия по Java NIO Buffer в учебном пособии по Java на Jenkov.com.
Однако ...
В реальных приложениях, использующих действительно большие файлы, узким местом в производительности часто оказывается производительность файловой системы и запоминающих устройств или то, что вы делаете с данными для их обработки ... как только они попадают в память.
Рекомендуется , чтобы не оптимизировать ввод-вывод вашего приложения до тех пор, пока у вас не заработает функциональность более высокого уровня, и вы не сможете написать и запустить тест. Затем вы должны профилировать приложение, чтобы найти узкие места на самом деле. Наконец, оптимизация узких мест.
Если вы действительно не опытны (и часто даже если не имеете), ваши инстинкты о том, куда лучше всего потратить усилия по оптимизации, часто бывают неверными.
Наконец, самый быстрый способ подсчета строк в файле - это, вероятно, забыть о Java и использовать стандартную утилиту для собственного кода; например в Unix / Linux / MacOS используйте wc pathname
.