Сканер против BufferedReader
Насколько я знаю, два наиболее распространенных метода чтения символьных данных из файла в Java используют Scanner
или же BufferedReader
, Я также знаю, что BufferedReader
эффективно читать файлы, используя буфер, чтобы избежать операций с физическим диском. Мои вопросы:
- Есть ли
Scanner
выполняет так же, какBufferedReader
? - Почему бы вы выбрали
Scanner
надBufferedReader
или наоборот?
12 ответов
Scanner
используется для анализа токенов из содержимого потока, в то время как BufferedReader
просто читает поток и не выполняет никакого специального анализа.
На самом деле вы можете передать BufferedReader
к scanner
в качестве источника символов для разбора.
В последней версии / сборке JDK6 (b27) Scanner
имеет меньший буфер ( 1024 символа) в отличие от BufferedReader
( 8192 знака), но этого более чем достаточно.
Что касается выбора, используйте Scanner
если вы хотите проанализировать файл, используйте BufferedReader
если вы хотите прочитать файл построчно. Также см. Вводный текст их вышеупомянутой документации API.
- Парсинг = интерпретация заданного ввода как токена (части). Он может вернуть вам определенные части непосредственно как int, string, decimal и т. Д. См. Также все эти
nextXxx()
методы вScanner
учебный класс. - Чтение = немой поток Он возвращает вам все символы, которые вы, в свою очередь, должны вручную проверить, хотите ли вы подобрать или составить что-то полезное. Но если вам все равно не нужно этого делать, тогда чтения достаточно.
Смотрите эту ссылку, оттуда цитируется следующее:
BufferedReader - это простой класс, предназначенный для эффективного чтения из нижележащего потока. Как правило, каждый запрос на чтение, сделанный из Reader, такого как FileReader, вызывает соответствующий запрос на чтение в базовом потоке. Каждый вызов read() или readLine() может привести к тому, что байты будут считаны из файла, преобразованы в символы и затем возвращены, что может быть очень неэффективным. Эффективность значительно улучшается, если Reader деформируется в BufferedReader.
BufferedReader синхронизирован, поэтому операции чтения в BufferedReader можно безопасно выполнять из нескольких потоков.
С другой стороны, в сканер встроено гораздо больше сыра; он может делать все, что может делать BufferedReader, и на том же уровне эффективности. Однако, кроме того, сканер может анализировать основной поток на предмет примитивных типов и строк с помощью регулярных выражений. Он также может маркировать основной поток с выбранным вами разделителем. Он также может выполнять прямое сканирование основного потока без учета разделителя!
Сканер, однако, не является поточно-ориентированным, он должен быть внешне синхронизирован.
Выбор использования BufferedReader или сканера зависит от кода, который вы пишете, если вы пишете простое средство чтения журнала Buffered reader достаточно. Однако, если вы пишете синтаксический анализатор XML, это более естественный выбор.
Даже при чтении ввода, если вы хотите принять пользовательский ввод построчно и просто добавить его в файл, BufferedReader достаточно хорош. С другой стороны, если вы хотите принять пользовательский ввод как команду с несколькими параметрами, а затем намереваетесь выполнять различные операции в зависимости от указанной команды и параметров, лучше подойдет сканер.
BufferedReader
имеет значительно большую буферную память, чем сканер. использованиеBufferedReader
если вы хотите получить длинные строки из потока, и используйтеScanner
если вы хотите проанализировать токен определенного типа из потока.Scanner
можно использовать токенизацию с помощью пользовательского разделителя и анализировать поток в примитивные типы данных, в то время какBufferedReader
может только читать и хранить строки.BufferedReader
синхронно в то время какScanner
не является. использованиеBufferedReader
если вы работаете с несколькими потоками.Scanner
скрывает IOException в то время какBufferedReader
бросает это немедленно.
Разница между BufferedReader и Scanner заключается в следующем:
- BufferedReader синхронизирован, но сканер не синхронизирован.
- BufferedReader является поточно-ориентированным, но Scanner не является поточно-ориентированным.
- BufferedReader имеет большую буферную память, но Scanner имеет меньшую буферную память.
- BufferedReader работает быстрее, но Scanner работает медленнее.
Код для чтения строки из консоли:
BufferedReader:
InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br= new BufferedReader(isr); String st= br.readLine();
Сканер:
Scanner sc= new Scanner(System.in); String st= sc.nextLine();
Я предлагаю использовать BufferedReader
для чтения текста. Scanner
шкуры IOException
в то время как BufferedReader
бросает это немедленно.
Ниже приведены различия между BufferedReader и сканером.
- BufferedReader только читает данные, но сканер также анализирует данные.
- вы можете читать только String с помощью BufferedReader, но вы можете читать int, long или float с помощью Scanner.
- BufferedReader более старый от Scanner, он существует от jdk 1.1, в то время как Scanner был добавлен в выпуске JDK 5.
- Размер буфера BufferedReader велик (8 КБ) по сравнению с 1 КБ сканера.
- BufferedReader больше подходит для чтения файла с длинной строкой, в то время как Scanner больше подходит для чтения небольшого пользовательского ввода из командной строки.
- BufferedReader синхронизирован, а Сканер - нет. Это означает, что вы не можете совместно использовать Сканер между несколькими потоками.
- BufferedReader работает быстрее, чем Scanner, потому что не тратит время на разбор
- BufferedReader немного быстрее по сравнению со сканером
- BufferedReader из пакета java.io, а сканер из пакета java.util на основании пунктов, которые мы можем выбрать по своему выбору.
Спасибо
BufferedReader
синхронно в то время какScanner
не является.BufferedReader
следует использовать, если мы работаем с несколькими потоками.BufferedReader
имеет значительно большую буферную память, чемScanner
,Scanner
имеет небольшой буфер (1KB символьный буфер), в отличие отBufferedReader
(Буфер размером 8 КБ), но этого более чем достаточно.BufferedReader
немного быстрее по сравнению сScanner
так какScanner
выполняет анализ входных данных иBufferedReader
просто читает последовательность символов.
================================================== ======================
Основные отличия:
- сканер
- Простой текстовый сканер, который может анализировать примитивные типы и строки, используя регулярные выражения.
- Сканер разбивает свои входные данные на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу. Полученные токены могут затем быть преобразованы в значения различных типов с использованием различных следующих методов.
пример
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
печатает следующий вывод:
1
2
red
blue
Тот же вывод может быть сгенерирован с помощью этого кода, который использует регулярное выражение для анализа всех четырех токенов одновременно:
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(result.group(i));
s.close(); `
BufferedReader:
Считывает текст из потока ввода символов, буферизует символы, чтобы обеспечить эффективное чтение символов, массивов и строк.
Размер буфера может быть указан, или размер по умолчанию может быть использован. Значение по умолчанию достаточно велико для большинства целей.
Как правило, каждый запрос чтения, сделанный устройством чтения, вызывает соответствующий запрос чтения базового символа или байтового потока. Поэтому желательно обернуть BufferedReader вокруг любого Reader, чьи операции read() могут быть дорогостоящими, например FileReaders и InputStreamReaders. Например,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
буферизует ввод из указанного файла. Без буферизации каждый вызов read() или readLine() может привести к тому, что байты будут считаны из файла, преобразованы в символы и затем возвращены, что может быть очень неэффективным. Программы, которые используют DataInputStreams для текстового ввода, могут быть локализованы путем замены каждого DataInputStream соответствующим BufferedReader.
Источник: Ссылка
Класс Scanner является дополнением к классу Formater (используется для преобразования двоичных данных в форматированный текст). Сканер считывает отформатированный ввод и преобразует его в двоичную форму. Хотя всегда можно было прочитать форматированный ввод, это потребовало больше усилий, чем хотелось бы большинству программистов. Благодаря добавлению Сканера теперь легко читать все типы числовых значений, строк и других типов данных, будь то данные из файла на диске, клавиатуры или другого источника. Сканер может использоваться для чтения ввода из консоли, файла, строки или любого другого источника, который реализует интерфейс Readable или ReadableByteChannel. Например, вы можете использовать сканер, чтобы прочитать число с клавиатуры и присвоить его значение переменной.
BufferedReader, с другой стороны, является классом ввода / вывода символьного потока. Символьные потоки предоставляют удобный способ ввода и вывода в терминах символов (Unicode). BufferedReader в основном используется для получения ввода с консоли, System.in
, Он принимает объект InputStreamReader в качестве аргумента.
Есть разные способы ввода данных в Java, такие как:
1) BufferedReader 2) Сканер 3) Аргументы командной строки
BufferedReader Чтение текста из потока ввода символов, буферизация символов, чтобы обеспечить эффективное чтение символов, массивов и строк.
Где Scanner - простой текстовый сканер, который может анализировать примитивные типы и строки, используя регулярные выражения.
если вы пишете простую программу чтения журнала, то буферная программа чтения подходит. если вы пишете синтаксический анализатор XML, это более естественный выбор.
Для получения дополнительной информации, пожалуйста, обратитесь:
Ответ ниже взят из Чтения из Консоли: JAVA Scanner vs BufferedReader
Когда вы читаете ввод с консоли, есть два варианта для достижения этой цели. Первое использование Scanner
другое использование BufferedReader
, Оба они имеют разные характеристики. Это означает различия, как использовать это.
Сканер рассматривал данный ввод как токен. BufferedReader просто прочитал построчно данные, введенные в виде строки. Сканер сам по себе предоставляет возможности синтаксического анализа, такие как nextInt(), nextFloat().
Но чем отличаются другие?
- Сканер рассматривал данный ввод как токен. BufferedReader как строка потока / строка
- Сканер токенизировал заданный вход с помощью регулярных выражений При использовании BufferedReader необходимо написать дополнительный код
- BufferedReader быстрее, чем Scanner * точка №. 2
- Сканер не синхронизирован, BufferedReader синхронизирован
Сканер поставляется с JDK версии 1.5 и выше.
Когда следует использовать сканер или Buffered Reader?
Посмотрите на основные различия между ними, один из которых использует токены, другие используют потоковую линию. Если вам нужны возможности анализа, используйте вместо этого сканер. Но мне удобнее с BufferedReader. Когда вам нужно прочитать из файла, используйте BufferedReader, потому что он использует буфер при чтении файла. Или вы можете использовать BufferedReader в качестве входных данных для сканера.
Список немногих...
java.util.Scanner
Класс - это простой текстовый сканер, который может анализировать примитивные типы и строки. Он внутренне использует регулярные выражения для чтения различных типов.
Java.io.BufferedReader
класс читает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное чтение последовательности символов
1) BufferedReader
синхронно в то время как Scanner
не является. BufferedReader
следует использовать, если мы работаем с несколькими потоками.
2)BufferedReader
имеет значительно большую буферную память, чем Scanner
, Scanner
имеет небольшой буфер (1KB символьный буфер), в отличие от BufferedReader
(Буфер размером 8 КБ), но этого более чем достаточно.
3)BufferedReader
немного быстрее по сравнению сScanner
так как Scanner
выполняет анализ входных данных и BufferedReader
просто читает последовательность символов.
BufferedReader, вероятно, даст вам лучшую производительность (потому что Scanner основан на InputStreamReader, посмотрите источники).ups, для чтения из файлов он использует nio. Когда я тестировал производительность nio в сравнении с производительностью BufferedReader для больших файлов, nio показывал немного лучшую производительность.- Для чтения из файла попробуйте Apache Commons IO.
Я предпочитаю Scanner
потому что он не генерирует проверенные исключения и, следовательно, его использование приводит к более обтекаемому коду.