扫描仪与BufferedReader

Mad*_*bæk 267 java file-io bufferedreader java.util.scanner

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

  • 是否Scanner执行以及BufferedReader
  • 你为什么选择Scanner,BufferedReader反之亦然?

Cha*_*kar 194

Scanner用于从流的内容解析标记,而BufferedReader只是读取流并且不进行任何特殊的解析.

实际上,您可以将a 作为要解析的字符源传递BufferedReader给a scanner.

  • BufferedReader是同步的而Scanner不是,因此由您来决定. (52认同)

Bal*_*usC 174

在目前最新的JDK6发布/版本(b27)中,Scanner缓冲区(1024个字符)与BufferedReader(8192个字符)相比有更小的缓冲区,但它已经绰绰有余了.

至于选择,使用Scannerif你想解析文件,BufferedReader如果你想逐行读取文件使用.另请参阅其上述API文档的介绍性文本.

  • 解析 =将给定输入解释为标记(部分).它能够直接以int,string,decimal等形式返回特定的部分.另请参见课堂上的所有nextXxx()方法Scanner.
  • 阅读 =哑流媒体.它不断回馈你所有的角色,你必须手动检查你是否想要匹配或组合有用的东西.但如果你不需要这样做,那么阅读就足够了.

  • @Asif:parsing =将给定输入解释为标记(部分).它能够直接以int,string,decimal等形式返回特定的部分.另请参阅Scanner类中的所有nextXxx()方法.阅读=哑流媒体.它不断回馈你所有的角色,你必须手动检查你是否想要匹配或组合有用的东西.但如果你不需要这样做,那么阅读就足够了. (7认同)
  • 好一个。感谢您的缓冲提示。一直在寻找它,因为本地阅读非常昂贵。 (2认同)
  • @BalusC你是什么意思解析和阅读?对不起,我很困惑 (2认同)

Jom*_*oos 77

看到这个链接,引用如下:

BufferedReader是一个简单的类,用于有效地从底层流中读取.通常,由读取器(如FileReader)构成的每个读取请求都会导致对基础流进行相应的读取请求.每次调用read()或readLine()都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的.如果Reader在BufferedReader中变形,效率会明显提高.

BufferedReader是同步的,因此可以安全地从多个线程完成对BufferedReader的读取操作.

另一方面,扫描仪内置了更多的奶酪; 它可以完成BufferedReader可以做的所有事情,并且效率也相同.但是,另外,Scanner可以使用正则表达式解析基础流的基本类型和字符串.它还可以使用您选择的分隔符对基础流进行标记.它也可以对底层流进行前向扫描,而不考虑分隔符!

然而,扫描仪不是线程安全的,它必须在外部同步.

使用BufferedReader或扫描仪的选择取决于您编写的代码,如果您正在编写简单的日志读取器,则缓冲读取器就足够了.但是,如果您正在编写XML解析器,则扫描器是更自然的选择.

即使在读取输入时,如果想逐行接受用户输入并说只需将其添加到文件中,BufferedReader就足够了.另一方面,如果您希望将用户输入作为具有多个选项的命令接受,然后打算根据指定的命令和选项执行不同的操作,则扫描程序将更适合.


Suj*_* PS 40

  1. BufferedReader具有比Scanner大得多的缓冲存储器.使用BufferedReader,如果你想从流中获得长字符串,然后使用Scanner,如果你想从流分析特定类型的令牌.

  2. Scanner可以使用自定义分隔符使用tokenize并将流解析为原始类型的数据,同时BufferedReader只能读取和存储String.

  3. BufferedReader是同步而Scanner不是.使用BufferedReader,如果你正在使用多线程工作.

  4. Scanner隐藏IOException,同时BufferedReader立即抛出它.


小智 18

我建议BufferedReader用于阅读文字.Scanner隐藏,IOException同时BufferedReader立即抛出它.


Ram*_*pta 11

BufferedReaderScanner之间的区别如下:

  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();
    
    Run Code Online (Sandbox Code Playgroud)

    扫描仪:

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();
    
    Run Code Online (Sandbox Code Playgroud)


dhS*_*dhS 8

以下是BufferedReader和Scanner之间的区别

  1. BufferedReader仅读取数据,但扫描程序也解析数据.
  2. 你只能使用BufferedReader读取String,但你可以使用Scanner读取int,long或float.
  3. BufferedReader比Scanner更旧,它存在于jdk 1.1,而在JDK 5版本中添加了Scanner.
  4. 与1KB的Scanner相比,BufferedReader的缓冲区大小很大(8KB).
  5. BufferedReader更适合读取长String的文件,而Scanner更适合从命令提示符读取小用户输入.
  6. BufferedReader已同步,但Scanner未同步,这意味着您无法在多个线程之间共享Scanner.
  7. BufferedReader比Scanner更快,因为它没有花时间解析
  8. 与Scanner相比,BufferedReader有点快
  9. BufferedReader来自java.io包,Scanner来自java.util包,基于我们可以选择的点.

谢谢


Shi*_*ari 6

主要差异:

  1. 扫描器

  • 一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串.
  • 扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格.然后可以使用各种下一种方法将得到的标记转换成不同类型的值.

 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(); 
Run Code Online (Sandbox Code Playgroud)

打印以下输出:

 1
 2
 red
 blue 
Run Code Online (Sandbox Code Playgroud)

使用此代码可以生成相同的输出,该代码使用正则表达式一次解析所有四个标记:

 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(); `
Run Code Online (Sandbox Code Playgroud)

  1. BufferedReader中:

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

    • 可以指定缓冲区大小,或者可以使用默认大小.对于大多数用途,默认值足够大.

通常,由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成.因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders.例如,

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
Run Code Online (Sandbox Code Playgroud)

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

来源:链接