Scanner vs. BufferedReader

据我所知,在Java中从文件中读取基于字符的数据的两种最常见的方法是使用ScannerBufferedReader。我还知道BufferedReader通过使用缓冲区来避免物理磁盘操作来有效地读取文件。

我的问题是:

  • Scanner的性能和BufferedReader一样好吗?
  • 为什么你会选择Scanner而不是BufferedReader,反之亦然?
293366 次浏览

Scanner用于从流的内容中解析令牌,而BufferedReader只是读取流,不做任何特殊的解析。

事实上,你可以将BufferedReader传递给scanner作为要解析的字符源。

在当前最新的JDK 18发行版/构建(b37)中,Scanner的缓冲区(1024个字符)比BufferedReader (8192个字符)更小,但这已经足够了。

至于选择,如果你想解析文件,使用Scanner,如果你想逐行文件,使用BufferedReader。也请参阅前面链接的API文档的介绍文本。

  • 解析 =将给定的输入解释为符号(部分)。它可以直接返回特定的部分,如int,字符串,小数等。另请参阅Scanner类中的所有nextXxx()方法。
  • 阅读 =哑流。它不断返回给你所有的字符,你反过来必须手动检查,如果你想匹配或组合一些有用的东西。但如果你不需要这样做,那么阅读就足够了。
  1. BufferedReader可能会给你更好的性能(因为Scanner是基于InputStreamReader,查看源代码)。哎呀,从文件中读取数据使用nio。当我对大文件的nio性能与BufferedReader性能进行测试时,nio显示出更好的性能。
  2. 要从文件中读取数据,请尝试Apache Commons IO

我建议使用BufferedReader来读取文本。Scanner隐藏IOException,而BufferedReader立即抛出它。

看这个链接,从这里引用了以下语句:

BufferedReader是一个简单的类,用于有效地从 下属流。一般来说,每个读请求都是由一个Reader发出的 FileReader会引起一个相应的读请求 潜在的流。每次调用read()或readLine()都可以 导致从文件中读取字节,转换为字符和 然后返回,这是非常低效的。效率提高 如果Reader在BufferedReader中发生了扭曲,则会产生明显的影响

BufferedReader是同步的,所以BufferedReader上的读取操作

另一方面,扫描仪有更多的奶酪内置在里面;它 可以做所有的BufferedReader可以做的,在相同的水平 还有效率。但是,除此之外,Scanner还可以解析 使用regular的基本类型和字符串的底层流 表达式。方法对底层流进行标记 您选择的分隔符。它也可以做前向扫描 底层流忽略分隔符!< / p > 然而,扫描器不是线程安全的,它必须是外部的 同步。< / p > 使用BufferedReader或Scanner的选择取决于代码 如果您正在编写一个简单的日志读取器Buffered 读一本就够了。但是,如果您正在编写XML解析器Scanner 是更自然的选择。

即使在读取输入时,如果要接受用户输入的行by 然后把它添加到文件中,BufferedReader就足够了。 另一方面,如果你想接受用户输入作为命令用 多个选项,然后打算执行不同的操作 根据指定的命令和选项,Scanner将适合 好。< / p >
  1. BufferedReader具有比Scanner更大的缓冲区内存。如果你想从流中获取长字符串,使用BufferedReader;如果你想从流中解析特定类型的令牌,使用Scanner

  2. Scanner可以使用自定义分隔符使用标记化,并将流解析为基本数据类型,而BufferedReader只能读取和存储String。

  3. BufferedReader是同步的,而Scanner不是。如果你使用多线程,请使用BufferedReader

  4. Scanner隐藏IOException,而BufferedReader立即抛出。

下面的答案来自从控制台读取:JAVA扫描器vs BufferedReader

当从控制台读取输入时,有两个选项可以实现这一点。第一次使用Scanner,另一次使用BufferedReader。两者都有不同的特点。这意味着如何使用它的差异。

Scanner将给定的输入作为令牌处理。BufferedReader只是将输入作为字符串逐行读取。Scanner本身提供了解析功能,就像nextInt()nextFloat()

但是,别人又有什么区别呢?

  • 扫描仪将给定的输入作为令牌处理。BufferedReader作为流线/字符串。
  • 扫描仪标记给定输入使用regex。使用BufferedReader必须编写额外的代码。
  • BufferedReader扫描仪 *快2
  • 扫描仪未同步,BufferedReader已同步

ScannerJDK 1.5和更高版本开始。

什么时候应该使用扫描器,还是缓冲阅读器?

看看它们之间的主要区别,一个使用标记化,另一个使用流线。当你需要解析功能时,使用Scanner代替。但是,我用BufferedReader更舒服。当你需要从一个文件中读取数据时,使用BufferedReader,因为它在读取文件时使用缓冲内存,这减少了物理驱动器的使用。或者你可以使用BufferedReader作为Scanner的输入。

在java中有不同的输入方式,比如:

1) BufferedReader 2) Scanner 3)命令行参数

BufferedReader从字符输入流中读取文本,缓冲字符,以便有效地读取字符、数组和行。

Where Scanner是一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串。

如果您正在编写一个简单的日志读取器,缓冲读取器就足够了。如果您正在编写XML解析器,那么Scanner是更自然的选择。

如需更多信息,请参考:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69 < / > < / p >

我更喜欢Scanner,因为它不会抛出检查异常,因此它的使用导致更精简的代码。

主要区别:

  1. 扫描仪

  • 简单的文本扫描器,可以解析基本类型和字符串使用正则表达式。
  • Scanner使用分隔符模式将其输入分解为令牌,该模式默认情况下匹配空白。然后可以使用各种next方法将生成的标记转换为不同类型的值。

例子:

 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();

  1. BufferedReader:
  • 从字符输入流中读取文本,缓冲字符以提供对字符、数组和行的有效读取。

  • 可以指定缓冲区大小,也可以使用默认大小。默认值对于大多数目的来说足够大。

一般来说,对Reader发出的每个读请求都会导致对底层字符或字节流发出相应的读请求。因此,建议将BufferedReader包装在read()操作代价较高的Reader周围,例如filereader和inputstreamreader。例如,

BufferedReader in = new BufferedReader(new FileReader("foo.in"));
 

将缓冲来自指定文件的输入。在没有缓冲的情况下,每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效。 使用DataInputStreams进行文本输入的程序可以通过将每个DataInputStream替换为适当的BufferedReader来本地化

源使用: https://docs.oracle.com

BufferedReader扫描仪的区别是:

  1. BufferedReader读取数据,而扫描仪解析数据。
  2. 只能使用BufferedReader读取String,使用扫描仪可以读取不同的数据类型,如int
  3. BufferedReader扫描仪更老,它是在JDK 1.1上添加的,而扫描仪是在JDK 5版本上添加的。
  4. 扫描仪的1KB相比,BufferedReader的缓冲区大小更大(8KB)。
  5. BufferedReader更适合读取具有较长字符串的文件,而扫描仪更适合从命令提示符读取较小的用户输入。
  6. BufferedReader是同步的,而扫描仪不是,这意味着你不能在多个线程之间共享扫描仪
  7. BufferedReader扫描仪快,因为它不花时间解析。
  8. BufferedReader扫描仪快一点。
  9. BufferedReader来自java.io包,而扫描仪来自java.util包。

在此基础上,我们可以选择我们的选择。

感谢阅读!

BufferedReader扫描仪的区别如下:

  1. BufferedReader是同步,而Scanner是不同步的
  2. BufferedReader是线程安全的,而Scanner是非线程安全
  3. BufferedReader 具有更大的缓冲内存而Scanner 具有较小的缓冲内存
  4. BufferedReader是,而Scanner是执行速度慢
  5. 从控制台读取一行的代码:

BufferedReader:

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String st = br.readLine();
       

// You can make the object InputStreamReader object inside the BufferReader method.
BufferReader br = new BufferedReader(InputStreamReader(System.in));
String st = br.readLine();


// You can even inspect the type of the input stream manually by using Parse method which accepts string parameter.
int x = Integer.parseInt(br.readLine());


// Or you can pass the object directly.
int x = Integer.parseInt(st);

扫描仪:

Scanner sc = new Scanner(System.in);
String st = sc.nextLine();