Вопрос по file, java, input – Сканер против InputStreamReader

13

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

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

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

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

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));
Связанные с:stackoverflow.com/questions/2231369/scanner-vs-bufferedreader Paul Bellora
Связанные с:Scanner v. StreamTokenizer. trashgod

Ваш Ответ

3   ответа
8

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

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

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

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

3

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

3

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы