13

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

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

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

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

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

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));
  • 3

    С точки зрения производительности

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

  • 3

    Разница

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

  • 8

    Первое, что

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

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

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

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