Java io bufferedreader
Потоки Reader и Writer
Абстрактные классы Reader и Writer являются символьными потоками.
Абстрактный класс Reader
Класс Reader обеспечивает поддержку символьного потока чтения аналогично тому, как это делает InputStream, реализующий модель байтового потока ввода. Методы Reader схожи с теми, которые объявлены в составе InputStream.
Методы класса Reader
При реализации Reader требуется, чтобы производный класс (наследник) обеспечил практическое воплощение варианта метода read, осуществляющего чтение данных в массив символов, и версии метода close. Во многих случаях, однако, производительность операций может быть улучшена за счет переопределения в производных классах и других методов.
Наследники класса Reader
- BufferedReader — буферизированный входной символьный поток; увеличивает производительность за счёт буферизации ввода;
- CharArrayReader — входной поток чтения символьного массива;
- FileReader — входной поток чтения содержимого файла; в конструкторе класса нужно указать либо путь к файлу, либо объект типа File;
- FilterReader — фильтрующий читатель;
- InputStreamReader — входной поток, транслирующий байты в символы;
- LineNumberReader — входной поток, подсчитывающий строки;
- PipedReader — входной канал;
- PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
- StringReader — входной поток, читающий из строки.
Класс BufferedReader
Широкораспространенный в использовании класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.
BufferedReader имеет следующие конструкторы :
Примеры BufferedReader
В качестве примера рассмотрим программу подсчета общего количества символов и числа пробелов в символьном потоке чтения:
Программе в качестве параметра передается имя файла в командной строке. Переменная in представляет символьный поток чтения. Если имя файла не задано, то используется стандартный поток ввода, System.in, после «вложения» его в объект типа InputStreamReader, который выполняет преобразование байтового потока ввода в символьный поток чтения. В противном случае создается объект типа FileReader, расширяющего класс Reader.
В цикле for подсчитывается общее количество символов в файле. Кроме этого, с использованием метода isWhitespace класса Character выявляются символы пробела и вычисляется их количество, а затем на экран выводится результат.
Абстрактный класс Writer
Абстрактный класс Writer обеспечивает поддержку символьного потока записи аналогично тому, как это делает OutputStream, реализующий модель байтового потока вывода. Многие методы Writer схожи с теми, которые объявлены в OutputStream; помимо этого, в классе Writer предусмотрены некоторые другие полезные версии метода write.
Методы класса Writer
Все методы класса вызывают исключение IOException при возникновении ошибки.
How to read file in Java – BufferedReader
In this article, we will show you how to use java.io.BufferedReader to read content from a file
1. Files.newBufferedReader (Java 8)
In Java 8, there is a new method Files.newBufferedReader(Paths.get(«file»)) to return a BufferedReader
2. BufferedReader
2.1 A classic BufferedReader with JDK 1.7 try-with-resources to auto close the resources.
2.2 In the old days, we have to close everything manually.
References
mkyong
Comments
Very good and “to the point” article! Congrats!
[…] visit How to read file from Java – BufferedReader Example 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 […]
Hello sir pls send me code of BufferReader…Sir please…
Congratulations, for your posts, is has helped me a lot!
Thanks a bunch! You just saved my day.
Excelent!
just for comment, in your first example, the line
“br = new BufferedReader(new FileReader(FILENAME));”
wasn’t necessary!
Thank you!
I learn a lot with you!
Thank you this is anice example.
Article is updated, thanks for your comment.
In your example, you should make sure to close the BufferedReader, otherwise the file may be lock not readable by some other process.
so
….
while ((sCurrentLine = br.readLine()) != null) <
System.out.println(sCurrentLine);
>
Example is updated, with new JDK7 example.
sir i want jtree tool coding for netbeans 6.9
great work done by grat man
somebody help this problem …
how to read this file 1
23
45
Finally after much searching, you answered my question, Mike ! Thanks ! There are a lot of people out in the web asking the same question. When they and, (up till a few moments ago), myself included, try to “import” a simple text file into an Eclipse project, we were all receiving “file not found”. Being new to Java I was amazed that this was such an “issue” for eclipse. I like Eclipse but something so fundamental, shouldn’t be so frustratingly hard. I guess the Devs are busy working on other more urgent issues and we cant complain as it … Read more »
Java BufferedReader Example
Posted by: Nikos Maravitsas in BufferedReader April 22nd, 2014 0 Views
In this example we are going to talk about BufferedReader Java class. BufferedReader is a subclass of Reader class. As you might know, Reader is a utility class for reading character streams. Such a stream could be obtained from a text file, from the console , from a socket, from a pipe , from a database or even from a memory location. Any resource that represents a sink of characters can be read with a sub class of the Reader class. For example if that sink of characters is a text file, you can easily obtain such a Reader using FileReader class.
But in general, most helper classes that connect your program with an input source, offer a method that help you grab an InputStream connected to that source, so that you can read data from it and make them available for manipulation from inside your program. For example Socket class offers a getInputStream() method for that purpose. As you know, InputStream ‘s job is to read streams of bytes. Then, you can wrap that InputStream around a Reader class to bridge the byte stream to a character stream. In general, that reader is the InputStreamReader class. Using InputStreamReader you can read sequences of characters from a character stream. What this class simply does is to encode the bytes it reads to a specified character set encoding, like UTF-8 .
Using an InputStreamReader to read sequences of characters into a char[] array is usually good enough. But this is not the case for I/O intensive applications. The thing is that InputStreamReader ‘s read() method is not implemented in the most efficient way possible. Every time the read() method of InputStreamReader is invoked, it reads one byte from the byte stream and encodes it. If the character set requires the character to be presented in more than one bytes, then the reader has to read one more byte and encode both bytes. If you request to read 1000 characters this procedure will be repeated 1000 times, invoking a new read() call every time.
As you can imagine this can be a real performance bottleneck. In this situations, the simplest solution one can follow, is buffering. By buffering we imply that the input will not be read byte by byte, but rather by chunks of bytes. For example, instead of reading one byte and try to encode it to a character, you read 1024 bytes in an in-memory buffer, and efficiently perform your conversion there. The huge gain of this technique is that it massively reduces the I/O operations needed to read your input, plus the conversion from bytes to characters can be preformed much more efficiently, as it now operates in chucks of bytes and not single bytes.
To make buffering over character streams easy, effective and efficient java offers BufferedReader class. It wraps around a Reader (e.g an InpuStreamReader ) and adds that buffering functionality using an internal in-memory buffer. The default size of that buffer is 512 characters, but you can customize it a via BufferedReader(Reader in, int sz) constructor in its int sz argument. Another important functionality that BufferedReader adds, is the ability to read lines of text from a source. It is really very common to want to read a text source line by line, rather than character by character. BufferedReader offers a readLine() method that reads a line from the text source, packs it to a String and returns it to you.
Let’s see some example on how you can use a BufferedReader to read characters from various sources.
1. Obtain a BufferedReader form a file
Let’s see how you can obtain a buffered reader from a file.
Output:
A first thing to notice is that I’ve specified the internal buffer size of BufferedReader to be 4096 characters. And, as you can see, you can still use the conventional read methods to read character sequence. But the real highlight is readLine() , which enables you to read text files line by line. If you want you can still read bigger chunks at once and then convert them to String on your own. Perhaps, for some reason, you want to read your file 1000 characters at a time, instead of line by line.
Output:
Here is a more modern, NIO way … of how you can obtain a BufferedReader form a file:
2. Obtain a BufferedReader form the standard input
Let’s see how you can obtain a BufferedReader to read text lines from the console.
Output:
The above example is quite representative of how you can obtain BufferedReader from a source. From an InputStream , that reads bytes, you get an InpuStreamReader , that reads characters, and buffer it using a BufferedReader .
Java io bufferedreader
Начиная разговор о потоках ввода-вывода, в первую очередь я бы хотел, чтобы вы увидели главную задачу — программа должна иметь возможность передать данные кому-то еще. Еще раз — современная программа не существует в вакууме, в сегодняшних условиях подавляющее большинство программ требует интеграции с другими. Интеграция всегда подразумевает передачу данных. Т.е. одна программа как-то передает данные в другую.
Нам, как программистам,. нужен некий механизм ПЕРЕДАЧИ данных.
Дальше уже идет специализация — каким образом это можно сделать. На сегодня основных вариантов три:
- Файловая система — одна программа записывает в файл и другая программа читает данные из файла
- Сетевое взаимодействие — две программы используют сеть для передачи данных друг другу
- Передача из одной области памяти в другую. Данный вариант достаточно часто используется в рамках одной программы, но это не обязательно
Конечно же есть внешние устройства, которые подключаются, например, по USB, COM-порту или как-то еще. И для них тоже требуется передача данных. Хотя нередко для таких устройств операционная система может предложить некое подобие работы с файловой системой.
Сосредоточимся на передаче данных. Что это с технической точки зрения ? Да очень просто — надо “переслать” некое количество байт. Т.е одна программа (отправитель), используя какой-то механизм, “отправляет” байты, а другая (потребитель), используя тот же механизм, “потребляет” эти байты. Причем логично, что байты идут друг за другом от отправителя к потребителю … в виде некоего ПОТОКА байтов.
Это конечно же исключительно мои догадки, но мне кажется, что разработчики Java думали как-то так, когда создавали библиотеку для передачи данных. Основой для них стало понятие ПОТОКА данных.
Причем, что на мой взгляд, важно отметить — ПОТОК данных предполагает, что среда переноса данных может быть разная. Это файловая система, по сути контроллер жесткого диска. Или это сетевая карта, в которую (или из которой) записываются (читаются) байты. Во всех случаях, по сути, вы должны записать/считать байт по определенному адресу. Дальше в дело вступает электроника — вы записали байт по адресу, контроллер той же сетевой карты отправит это байт в сеть, где контроллер сетевой карты на другом компьютере поместит этот байт по определенному адресу, который будет доступен для чтения.
Таким образом можно рассматривать механизм потоков, как инструмент. С помощью которого вы как-бы подключаетесь к источнику данных (в случае чтения) или приемнику данных (в случае записи) и после подключения вам просто надо либо читать оттуда, либо писать.туда.
Мне почему-то всегды было удобно видеть это как некоторую “трубу”, с одной стороны которой мой код, а с другой стороны все, что может принимать (или порождать) набор байтов. Я просто “заливаю” в эту трубу байты. А как они там на другом конце трубы попадают в приемник — не мое дело. Я просто использую “трубы” под каждый вид приемника — для файла, для сети.
Еще крайне интересным моментов является возможность “соединять” разные потоки. Чуть позже мы увидим практическое воплощение этой идеи.
Если создать образное представление, то вы можете использовать трубу, которая например окрашивает воду, которая проходит через нее, в другой цвет. Или фильтрует. Или насыщает какими-то добавками. И на конец этой трубы вы “прикрепляете” трубу в другими возможностями. Вода (или байты) проходя по этим трубам, трансформируется.
Если смогли представить, то будет здОрово, если не получается — ничего страшного. Надеюсь, что дальнейшие примеры позволят вам это увидеть.
Типы потоков
По направлению движения данных потоки можно разделить на две группы:
- Поток ввода (Input) — данные поступают из потока в нашу программу. Мы их читаем из этого потока
- Поток вывода (Output) — данные поступают в поток из нашей программы. Мы их пишем в этот поток
Вторым критерием разделения может служить ТИП передаваемых данных. Да-да, байты не всегда являются удобным вариантом передачи — есть еще текст. Символы. Я надеюсь, вы помните, что символ в Java занимает ДВА байта. Так вот передача двух байтов как одного целого числа имеет сложность — какой байт должен идти первым ? Есть такая неприятная ситуация — в разных операционных системах этот вопрос решается по-разному.- вы можете поискать информацию в Интернете на тему big endian little endian и узнать, как непросто бывает подружить Windows и Linux или просто Linux на разных компьютерах. В данной статье я не ставлю такой задачи — просто констатирую факт: передача символов длиной в два байта требует дополнительных усилий. Поэтому и появилось такое разделение:
В итоге мы получаем 4 типа потоков. Для каждого из этих типов Java предлагает отдельный базовый абстрактный класс. Почему абстрактный ? Потому, что у нас есть специализация — файлы, сеть, память. И расширяя базовый класс специальный класс решает свои специальные задачи. Но базовые функции для всех одинаковые. Что удобно — все специальные потоки по своей сути одно и тоже. Это дает гибкость и универсальность. Вот эти классы:
- InputStream — поток для чтения байтов (поток ввода)
- Reader — поток для чтения символов (поток ввода)
- OutputStream — поток для записи байтов (поток вывода)
- Writer — поток для записи символов (поток вывода)
Основной функцией для потоков ввода является метод read в нескольких модификациях, которые мы рассмотрим позже. Разница для InputStream и Reader состоит только в том, что первый читает байты (byte), а второй — символы (char).
Вполне логично вытекает название основного метода для классов OutputStream и Writer — метод write. Тоже в нескольких модификациях.
Основные действия с потоком
Схема работы с потоком в упрощенном виде выглядит так:
- Создается экземпляр потока
- Поток открывается (для чтения или записи)
- Производится чтение из потока/запись в поток
- Поток закрывается
Первые два пункта часто совмещены в рамках одного действия. По сути потоки можно представить как трубу, в которую “заливаются” байты или символы. Причем что еще интереснее, эти трубы можно “склеивать” друг с другом. Т.е один поток может передавать данные в другой, предварительно как-то их модифицируя.
Этот прием мы еще увидим, а пока давайте решим простую задачу — запишем строку в файл. В текстовый файл. Т.е. Нам потребуется поток для символов — Writer. Потом мы прочитаем этот файл — и для этого используем Reader.
Чуть выше я говорил, что Reader и Writer — абстрактные классы. Для работы с файлами нам потребуются уже конкретные и это будут FileReader и FileWriter.
Первым шагом мы запишем текст в файл. Порядок работы с потоком я в принципе описал, поэтому давайте конкретизируем наши действия. Создание и открытие файлового потока на запись делает в момент создания экземпляра объекта FileWriter, у которого конструктор принимает в качестве параметра строку с именем файла. Далее в цикле мы пишем в поток символы из строки и потом закрываем наш поток. Обратите внимание на конструкцию блока try. Мы уже встречали такое в разделе JDBC — групповые операции.
Повторю его идею — в момент начала блока try .. catch вы можете открыть ресурс (важно, чтобы он реализовывал интерфейс AutoCloseable). В таком случае по окончании блока ресурс будет автоматически закрыт и вам не надо вызывать метод close. Блок try .. catch мы должны использовать, т.к. Операции по открытию и записи в файл могут порождать исключения FileNotFoundException и IOException. Исключение FileNotFoundException является подклассом IOException и в принципе нам нет необходимости обрабатывать его отдельно. Так что мы сократили все до IOException.
Также советую внимательно прочитать комментарии в коде — они объясняют многие моменты.
Перейдем от слов к делу — смотрим код нашего примера
Сканер против BufferedReader
245 Mads Mobæk [2010-02-09 21:17:00]
Насколько мне известно, два наиболее распространенных метода чтения основанных на символах данных из файла в Java используют Scanner или BufferedReader . Я также знаю, что BufferedReader эффективно считывает файлы, используя буфер, чтобы избежать операций с физическим диском. Мои вопросы:
- Выполняет ли Scanner , а также BufferedReader ?
- Почему вы выбрали Scanner над BufferedReader или наоборот?
java java.util.scanner file-io bufferedreader
15 ответов
181 Решение Chandra Sekar S [2010-02-09 21:20:00]
Scanner используется для разбора токенов из содержимого потока, а BufferedReader просто считывает поток и не выполняет никакого специального разбора.
Фактически вы можете передать BufferedReader в Scanner в качестве источника символов для синтаксического анализа.
157 BalusC [2010-02-09 21:21:00]
В последнем выпуске/сборке JDK6 (b27) у Scanner имеется меньший буфер (1024 символа) в отличие от BufferedReader (8192 символов), но это более чем достаточно.
Что касается выбора, используйте Scanner если вы хотите проанализировать файл, используйте BufferedReader если вы хотите прочитать файл по строкам. Также ознакомьтесь с вступительным текстом их документальных документов API.
- Parsing= интерпретация данного ввода как токенов (частей). Он способен возвращать вам определенные части непосредственно как int, string, decimal и т.д. См. Также все эти nextXxx() в классе Scanner .
- Чтение= немой поток. Он продолжает выдавать вам всех персонажей, которые вам, в свою очередь, придется вручную проверять, хотите ли вы совместить или составить что-то полезное. Но если вам все равно не нужно это делать, то чтение достаточно.
75 Jomoos [2011-12-11 18:50:00]
См. ссылку , после чего цитируется следующее:
BufferedReader — простой класс, предназначенный для эффективного чтения из подрывной поток. Как правило, каждый запрос на чтение, сделанный из Reader, как FileReader вызывает соответствующее запрос на чтение для базовый поток. Каждый вызов read() или readLine() может заставить байты считывать из файла, преобразовывать в символы и затем возвращается, что может быть очень неэффективным. Эффективность улучшена заметно, если Reader деформирован в BufferedReader.
BufferedReader синхронизирован, поэтому операции чтения на BufferedReader можно безопасно выполнять несколько потоков.
С другой стороны, в сканере есть намного больше сыра; Это может делать все, что может сделать BufferedReader, и на том же уровне эффективность. Однако, кроме того, сканер может анализировать базовый поток для примитивных типов и строк с использованием регулярных выражения. Он также может символизировать базовый поток с помощью разделитель по вашему выбору. Он также может выполнять прямое сканирование базовый поток без учета разделителя!
Однако сканер не является потокобезопасным, он должен быть снаружи синхронизированы.
Выбор использования BufferedReader или сканера зависит от кода вы пишете, если вы пишете простой бланк журнала Буферизация читатель является адекватным. Однако, если вы пишете синтаксический анализатор XML Scanner является более естественным выбором.
Даже при чтении ввода, если вы хотите принять входную строку пользователя и просто добавьте его в файл, BufferedReader достаточно хорош. С другой стороны, если вы хотите принять ввод пользователя как команду с несколько вариантов, а затем намерены выполнять разные операции на основе указанной команды и опций сканер подходит лучше.
35 Sujith PS [2014-02-11 12:39:00]
BufferedReader имеет значительно большую буферную память, чем сканер. Используйте BufferedReader , если вы хотите получить длинные строки из потока и используйте Scanner , если вы хотите разобрать конкретный тип токена из потока.
Scanner может использовать tokenize с помощью настраиваемого разделителя и анализировать поток в примитивные типы данных, тогда как BufferedReader может читать и хранить String.
BufferedReader является синхронным, а Scanner — нет. Используйте BufferedReader , если вы работаете с несколькими потоками.
Scanner скрывает IOException, а BufferedReader выдает его немедленно.
17 Evgeniy [2011-04-15 13:07:00]
Я предлагаю использовать BufferedReader для чтения текста. Scanner скрывает IOException , а BufferedReader выдает его немедленно.
10 jsroyal [2017-01-16 20:22:00]
- BufferedReader является синхронным, а Scanner не является.
- BufferedReader следует использовать, если мы работаем с несколькими потоками.
- BufferedReader имеет значительно большую буферную память, чем Scanner .
- Scanner имеет небольшой буфер (буфер 1KB char) в отличие от BufferedReader (буфер 8 Кбайт байт), но его более чем достаточно.
- BufferedReader немного быстрее по сравнению с Scanner , потому что Scanner выполняется синтаксический анализ входных данных, а BufferedReader просто читает последовательность символов.
Класс Сканер является дополнением класса Formater (используется для преобразования двоичных данных в форматированный текст). Сканер считывает форматированный ввод и преобразует его в свою двоичную форму. Несмотря на то, что всегда можно было читать форматированный ввод, требуется больше усилий, чем это предпочло бы большинству программистов. Из-за добавления Сканера теперь легко читать все типы числовых значений, строк и других типов данных, независимо от того, поступают они из файла диска, клавиатуры или другого источника. Сканер может использоваться для чтения ввода с консоли, файла, строки или любого другого источника, который реализует интерфейс Readable или ReadableByteChannel. Например, вы можете использовать Scanner для чтения номера с клавиатуры и назначения его значения переменной.
BufferedReader, с другой стороны, является классом ввода-вывода символьного потока. Потоки символов обеспечивают удобный способ ввода и вывода в терминах символов (Unicode). BufferedReader в основном используется для ввода ввода с консоли, System.in . В качестве аргумента требуется объект InputStreamReader.
6 dhS [2016-12-31 20:33:00]
Ниже приведены различия между BufferedReader и Scanner
- BufferedReader только считывает данные, но сканер также анализирует данные.
- вы можете читать String только с помощью BufferedReader, но вы можете читать int, long или float с помощью Scanner.
- BufferedReader старше от Сканера, он существует из jdk 1.1 while Сканер был добавлен в релиз JDK 5.
- Размер буфера BufferedReader большой (8 КБ) по сравнению с 1 КБ сканера.
- BufferedReader более подходит для чтения файла с длинной строкой в то время как сканер более подходит для чтения небольших пользовательских командной строки.
- BufferedReader синхронизирован, но Scanner — нет, это означает, что вы не может делиться сканером между несколькими потоками.
- BufferedReader быстрее, чем сканер, потому что он не потратил времени при разборе
- BufferedReader немного быстрее по сравнению со сканером
- BufferedReader — это пакет java.io и сканер из пакета java.util на основе точек мы можем выбрать наш выбор.
Основные отличия:
- сканер
- Простой текстовый сканер, который может анализировать примитивные типы и строки с использованием регулярных выражений.
- Сканер разбивает свой ввод на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу. Затем полученные маркеры могут быть преобразованы в значения разных типов с использованием различных следующих методов.
выводит следующий результат:
Тот же вывод может быть сгенерирован с помощью этого кода, который использует регулярное выражение для одновременного анализа всех четырех токенов:
BufferedReader:
Читает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное считывание символов, массивов и строк.
Можно указать размер буфера или использовать размер по умолчанию. Значение по умолчанию достаточно велико для большинства целей.
В общем, каждый запрос на считывание, сделанный из Reader, вызывает запрос соответствующего считывания из базового символа или байтового потока. Поэтому целесообразно обернуть BufferedReader вокруг любого Reader, чьи операции read() могут быть дорогостоящими, например FileReaders и InputStreamReaders. Например,
будет буферизовать ввод из указанного файла. Без буферизации каждый вызов read() или readLine() может привести к чтению байтов из файла, преобразованию в символы и возврату, что может быть очень неэффективным. Программы, использующие DataInputStream для текстового ввода, могут быть локализованы путем замены каждого DataInputStream на соответствующий BufferedReader.
Отличие между BufferedReader и Сканера:
- BufferedReader синхронизирован, но сканер не синхронизирован.
- BufferedReader потокобезопасен, но сканер не является потокобезопасным.
- BufferedReader имеет большую буферную память, но у сканера меньше буферной памяти.
- BufferedReader быстрее, но сканер медленнее в выполнении.
Код для чтения строки с консоли:
BufferedReader
Сканер
Существуют разные способы ввода ввода в java:
1) BufferedReader 2) Сканер 3) Аргументы командной строки
BufferedReader Прочитайте текст из потока ввода символов, буферизируя символы, чтобы обеспечить эффективное считывание символов, массивов и строк.
Где сканер представляет собой простой текстовый сканер, который может анализировать примитивные типы и строки с использованием регулярных выражений.
если вы пишете простой читатель журнала Буферизованный читатель является адекватным. если вы пишете синтаксический анализатор XML, более естественным вариантом является Scanner.
За дополнительной информацией обращайтесь:
1 KNU [2014-03-01 12:34:00]
Когда вы читаете ввод с консоли, для этого есть два варианта. Сначала используйте Scanner , другой — BufferedReader . Оба они имеют разные характеристики. Это означает различия в том, как использовать его.
Сканер обрабатывает данный вход как токен. BufferedReader просто читает строки за строкой, данные вводятся как строка. Сканер сам обеспечивает возможности синтаксического анализа, как nextInt(), nextFloat().
Но чем отличаются различия между?
- Сканер обрабатывает данный вход как токен. BufferedReader как строка потока/строка
- Отсканированный токен с помощью regex. Использование BufferedReader должно написать дополнительный код
- BufferedReader быстрее, чем сканер * point no. 2
- Сканер не синхронизирован, BufferedReader синхронизирован
Сканер поставляется с версии JDK версии 1.5 выше.
Когда следует использовать сканер или буферный ридер?
Посмотрите на основные различия между ними обоими, один использует токенизацию, другие используют линию потока. Когда вам нужны возможности синтаксического анализа, вместо этого используйте Scanner. Но мне удобнее BufferedReader. Когда вам нужно прочитать из файла, используйте BufferedReader, потому что он использует буфер при чтении файла. Или вы можете использовать BufferedReader в качестве входа в Scanner.
Листинг несколько.
java.util.Scanner class — это простой текстовый сканер, который может анализировать примитивные типы и строки. Он внутренне использует регулярные выражения для чтения разных типов.
Java.io.BufferedReader класс читает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное считывание последовательности символов
1) BufferedReader является синхронным, а Scanner — нет. BufferedReader следует использовать, если мы работаем с несколькими потоками.
2) BufferedReader имеет значительно большую буферную память, чем Scanner . Scanner имеет небольшой буфер (буфер 1KB char) в отличие от BufferedReader (буфер 8 Кбайт байт), но его более чем достаточно.
3) BufferedReader немного быстрее по сравнению с Scanner , потому что Scanner анализирует входные данные, а BufferedReader просто считывает последовательность символов.
Я предпочитаю Scanner , потому что он не выбрасывает проверенные исключения, и поэтому использование приводит к более упорядоченному коду.