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

Сканер vs InputStreamReader

Кто-нибудь знает, есть ли разница в производительности между двумя методами чтения входного файла ниже? Спасибо.

1) Чтение файла со сканером и файлом

Scanner input = new Scanner(new File("foo.txt"));

2) Чтение файла с помощью InputStreamReader и FileInputStream

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));
4b9b3361

Ответ 1

Первое, что ни этих образцов кода не читает файл. Это может показаться отвратительным или неправильным, но это правда. Фактически они открывают файл для чтения. И с точки зрения того, что они на самом деле делают, вероятно, нет большой разницы в их эффективности.

Когда дело доходит до фактического чтения файла, наилучший подход к использованию будет зависеть от того, что содержит файл, какова форма данных для ваших алгоритмов в памяти и т.д. Это будет определять, лучше ли используйте Scanner или raw Reader с точки зрения производительности и более важно с точки зрения надежного и удобного кода.

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

Единственный бит рекомендаций по производительности, который я бы дал, - это то, что символ по показаниям символов из небуферизованного входного потока или считывателя неэффективен. Если файл необходимо прочитать таким образом, вы должны добавить BufferyReader в стек.

Ответ 2

С точки зрения производительности, сканер определенно медленнее, по крайней мере, из моего опыта. Он предназначен для синтаксического анализа, а не для чтения огромных блоков данных. InputStreamReader с достаточно большим буфером может работать с параметром BufferedReader, который, как я помню, в несколько раз быстрее, чем сканер для чтения из списка словарей. Здесь сравнивается BufferedReader и InputStreamReader. Помните, что BufferedReader в несколько раз быстрее, чем сканер.

Ответ 3

Разница и главный, я думаю, это то, что с BufferedReader/InputStreamReader вы можете прочитать весь символ документа по символу, если хотите. С помощью сканера это невозможно. Это означает, что с помощью InputStreamReader вы можете иметь больше контроля над содержимым документа.;)