Сканер против BufferedReader
насколько я знаю, два наиболее распространенных метода чтения символьных данных из файла в Java используют Scanner
или BufferedReader
. Я также знаю, что BufferedReader
эффективно читать файлы с помощью буфера, чтобы избежать операций на физическом диске. Мои вопросы:
- тут
Scanner
выполняет, а такжеBufferedReader
? - почему вы выберите
Scanner
overBufferedReader
или наоборот?
15 ответов:
Scanner
используется для разбора токенов из содержимого потока whileBufferedReader
просто читает поток и не делает никакого специального разбора.на самом деле вы можете пройти
BufferedReader
доscanner
как источник символов для разбора.
в последней версии JDK6 release/build (b27), the
Scanner
имеет меньший буфер (1024 символов) в отличие отBufferedReader
(8192 символов), но этого более чем достаточно.что касается выбора, используйте
Scanner
Если вы хотите парсить файл, используйтеBufferedReader
Если вы хотите читать файл строка за строкой. Также см. вводный текст их aforelinked API документации.
- извлечение = интерпретация данного ввода в виде токенов (частей). Он может вернуть вам определенные части непосредственно как int, string, decimal и т. д. Смотрите также все эти
nextXxx()
методыScanner
класса.- чтение = тупой потокового. Он продолжает возвращать вам все символы, которые вы, в свою очередь, должны вручную проверить, хотите ли вы сопоставить или составить что-то полезное. Но если вам все равно не нужно этого делать, тогда чтения будет достаточно.
посмотреть этот ссылке, оттуда цитируется следующее:
BufferedReader-это простой класс, предназначенный для эффективного чтения из подчиненный ручей. Как правило, каждый запрос чтения читателя как FileReader вызывает соответствующий запрос на чтение основной поток. Каждый вызов read () или readLine() может заставить байты считываться из файла, преобразовываться в символы и затем возвращается, что может быть очень неэффективно. Эффективность улучшена заметно, если читатель деформирован в BufferedReader.
BufferedReader синхронизируется, поэтому операции чтения на BufferedReader можно безопасно сделать из нескольких потоков.
сканер с другой стороны, имеет гораздо больше сыра, встроенный в него; он может делать все, что может сделать BufferedReader и на том же уровне и эффективность тоже. Однако, кроме того, сканер может анализировать базовый поток для примитивных типов и строк с помощью регулярных выражения. Он также может маркировать базовый поток с помощью разделитель по вашему выбору. Оно может также сделать переднюю скеннирование базовый поток без учета разделителя!
сканер, однако, не является потокобезопасным, он должен быть внешне синхронизированный.
выбор использования BufferedReader или сканера зависит от кода вы пишете, если вы пишете простой журнал чтения Буферизованных читатель адекватен. Однако, если вы написание сканера анализатора XML это более естественный выбор.
даже при чтении ввода, если хотите принять строку ввода пользователя строка и сказать просто добавить его в файл, BufferedReader достаточно хорошо. С другой стороны, если вы хотите принять ввод пользователя в командной с несколько вариантов, а затем намерены выполнять различные операции в зависимости от команды и заданных параметров, сканер подойдет лучше.
BufferedReader
имеет значительно большую буферную память, чем сканер. ИспользуйтеBufferedReader
Если вы хотите получить длинные строки из потока, и использоватьScanner
Если вы хотите проанализировать определенный тип токена из потока.
Scanner
можно использовать tokenize с помощью пользовательского разделителя и разбирать поток на примитивные типы данных, в то время какBufferedReader
может только читать и хранить строку.
BufferedReader
это синхронно в то время какScanner
нет. ИспользоватьBufferedReader
Если вы работаете с несколькими потоками.
Scanner
скрывает IOException whileBufferedReader
сразу же бросает его.
Я предлагаю использовать
BufferedReader
для чтения текста.Scanner
скрываетIOException
покаBufferedReader
сразу же бросает его.
BufferedReader
это синхронно в то время какScanner
нет.BufferedReader
следует использовать, если мы работаем с несколькими потоками.BufferedReader
имеет значительно большую буферную память, чемScanner
.- The
Scanner
имеет небольшой буфер (1Kb char буфер) в отличие отBufferedReader
(8кб байтовый буфер), но этого более чем достаточно.BufferedReader
немного быстрее по сравнению сScanner
, потому чтоScanner
делает парсинг входных данных иBufferedReader
просто считывает последовательность из персонажей.========================================================================
на сканер класс является дополнением Formater класса (используется для преобразования двоичных данных в форматированный текст). Сканер считывает форматированный ввод и преобразует его в двоичную форму. Хотя всегда можно было прочитать форматированный ввод, это потребовало больше усилий, чем большинство программистов предпочли бы. Из-за добавления сканера теперь легко читать все типы числовых значений, строк и других типов данных, независимо от того, поступает ли он из дискового файла, клавиатура или другой источник. Сканер может использоваться для чтения входных данных из консоли, файла, строки или любого другого источника, реализующего читаемый интерфейс или ReadableByteChannel. Например, с помощью сканера можно считывать число с клавиатуры и присваивать его значение переменной.
BufferedReader, С другой стороны, это класс ввода-вывода потока символов. Символьные потоки обеспечивают удобный способ ввода и вывода в терминах символов (Unicode). BufferedReader в основном используется для ввода с консоли,
System.in
. Это занимает InputStreamReader объект в качестве аргумента.
Основные Отличия:
- сканер
- простой текстовый сканер, который может анализировать примитивные типы и строки с помощью регулярных выражений.
- сканер разбивает свой ввод на маркеры с помощью шаблона разделителя, который по умолчанию соответствует пробелам. Полученные маркеры могут быть затем преобразованы в значения различных типов с использованием различных следующих методы.
пример
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 вокруг любого устройства чтения, операции read() которого могут быть дорогостоящими, например FileReaders и InputStreamReaders. Например,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
буферизует входные данные из указанного файла. Без буферизации каждый вызов read () или readLine () может привести к тому, что байты будут считаны из файла, преобразованы в символы, а затем возвращены, что может быть очень неэффективно. Программы, использующие DataInputStreams для текстового ввода, могут быть локализованы путем замены каждого DataInputStream соответствующим BufferedReader.
источник:ссылке
Ниже приведены различия между BufferedReader и Scanner
- BufferedReader только считывает данные, но сканер также анализирует данные.
- вы можете читать только строку с помощью BufferedReader, но вы можете читать int, длинный или поплавок с помощью сканера.
- BufferedReader старше от сканера,он существует из jdk 1.1 в то время как Сканер был добавлен в выпуск JDK 5.
- размер буфера BufferedReader большой (8KB) по сравнению с 1KB из Сканер.
- BufferedReader больше подходит для чтения файлов с длинной строкой пока блок развертки более соответствующий для чтения небольшого входного сигнала потребителя от командная строка.
- BufferedReader синхронизируется, но сканер нет, что означает, что вы нельзя делить сканер между несколькими потоками.
- BufferedReader быстрее, чем сканер, потому что он не тратит время на разборе
- BufferedReader немного быстрее, чем сканер
- BufferedReader is от java.io пакет и сканер от java.пакет util на основании пунктов мы можем выбрать наш выбор.
спасибо
разницу между BufferedReader и сканер следующие:
- BufferedReader is синхронизироваться но сканер не синхронизируется.
- BufferedReader is потокобезопасным но сканер не потокобезопасными.
- BufferedReader имеет большую буферную память но сканер имеет меньшую буферную память.
- BufferedReader is быстрее но сканер замедление в исполнении.
код для чтения строки из консоли:
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();
существуют различные способы ввода в java, такие как:
1) BufferedReader 2) Сканер 3) Аргументы Командной Строки
BufferedReader считывает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное чтение символов, массивов и строк.
где сканер-это простой текстовый сканер, который может анализировать примитивные типы и строки с помощью регулярных выражений.
Если вы пишете простой читатель журнала Буферизованный читатель адекватен. если вы пишете XML-парсер сканер является более естественным выбором.
для получения дополнительной информации, пожалуйста, обратитесь:
ответ ниже взят из чтение из консоли: Java Scanner vs BufferedReader
при чтении ввода с консоли, есть два варианта существует для достижения этого. Сначала с помощью
Scanner
, используяBufferedReader
. Оба они имеют разные характеристики. Это означает различия в том, как его использовать.сканер рассматриваться с учетом ввода в качестве маркера. BufferedReader просто считывает строку за строкой, заданную в качестве строки. Блок развертки он собственная личность обеспечивает возможности разбора как раз как nextInt(), nextFloat().
но, что такое другие различия между ними?
- сканер рассматриваться с учетом ввода в качестве маркера. BufferedReader как строка потока / строка
- сканер маркируется заданным вводом с помощью регулярного выражения. С помощью BufferedReader необходимо написать дополнительный код
- BufferedReader быстрее, чем сканер * точка № 2
- сканер не синхронизирован, BufferedReader синхронизирован
сканер поставляется с версии JDK 1.5 выше.
когда следует использовать сканер, или Буферизованный читатель?
рассмотрим основные различия между ними, с помощью маркера, используя другие линии потока. Если вам нужны возможности синтаксического анализа, используйте сканер вместо этого. Но, я более комфортно с BufferedReader. Когда вам нужно прочитать из файла, используйте BufferedReader, потому что он использует буфер при чтении файла. Или вы можете использовать BufferedReader в качестве входных данных для сканера.
листинг несколько...
java.util.Scanner
класса простой текстовый сканер, который может проанализировать типы примитивов и строки. Он внутренне использует регулярные выражения для чтения различных типов.
Java.io.BufferedReader
класс читает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное чтение последовательности символов1)
BufferedReader
синхронно в то время какScanner
нет.BufferedReader
следует использовать, если мы работаем с различные потоки.2)
BufferedReader
имеет значительно большую буферную память, чемScanner
. ЭлементScanner
имеет небольшой буфер (1Kb char буфер) в отличие отBufferedReader
(8кб байтовый буфер), но этого более чем достаточно.3)
BufferedReader
немного быстрее по сравнению сScanner
, потому чтоScanner
делает разбор входных данных иBufferedReader
просто читает последовательность символов.
BufferedReader, вероятно, даст вам лучшую производительность (потому что сканер основан на InputStreamReader, посмотрите источники).ups, для чтения из файлов он использует nio. Когда я тестировал производительность nio против производительности BufferedReader для больших файлов, nio показывает немного лучшую производительность.- для чтения из файла попробуйте Apache Commons IO.