代码之家  ›  专栏  ›  技术社区  ›  Mads Mobæk

扫描仪与BufferedReader

  •  251
  • Mads Mobæk  · 技术社区  · 15 年前

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

    • 扫描仪 表现出色 缓冲区读取 ?
    • 你为什么要选择 扫描仪 结束 缓冲区读取 反之亦然?
    12 回复  |  直到 6 年前
        1
  •  185
  •   roottraveller    8 年前

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

    实际上你可以通过 缓冲区读取 到A scanner 作为要分析的字符源。

        2
  •  164
  •   Suragch Shmidt    6 年前

    在当前最新的JDK6发布/构建(B27)中, Scanner 有一个较小的缓冲区( 1024 chars )而不是 BufferedReader ( 8192 chars 但这已经足够了。

    至于选择,使用 扫描仪 如果你想 解析 文件,使用 缓冲区读取 如果你想 阅读 一行一行的文件。另请参见其先前链接的API文档的介绍性文本。

    • 句法分析 =将给定输入解释为标记(部分)。它可以直接把特定的部分作为int、string、decimal等返回给您。 nextXxx() 方法在 扫描仪 班级。
    • 阅读 =哑流。它不断地把所有字符都还给你,反过来你必须手动检查你是否想匹配或组合一些有用的字符。但如果你无论如何都不需要这样做,那么阅读就足够了。
        3
  •  76
  •   Eliran Malka    12 年前

    看到这个 link ,引述如下:

    BufferedReader是一个简单的类,用于有效地从 在溪流下面。通常,每个读请求都由类似 FileReader导致对 底层流。每次调用read()或readline()都可以 使字节从文件中读取,转换为字符,以及 然后返回,这可能是非常低效的。效率提高了 很明显,如果读卡器在缓冲读卡器中发生了扭曲。

    BufferedReader已同步,因此BufferedReader上的读取操作 可以从多个线程安全地完成。

    另一方面,扫描仪内置了更多的奶酪; 可以执行缓冲读卡器可以执行的所有操作,并且在 效率也是如此。但是,另外,扫描器可以分析 使用正则的基元类型和字符串的基础流 表达。它还可以用 您选择的分隔符。它还可以对 基础流忽略分隔符!

    但是,扫描器不是线程安全的,它必须是外部的 同步的。

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

    即使在读取输入时,如果要接受用户输入行 行并说只要把它添加到一个文件中,缓冲阅读器就足够了。 另一方面,如果要接受用户输入作为命令, 多个选项,然后打算执行不同的操作 根据指定的命令和选项,扫描仪将适合 更好。

        4
  •  37
  •   Sahil Chhabra    8 年前
    1. BufferedReader 具有比扫描仪更大的缓冲区内存。使用 缓冲区读取 如果要从流中获取长字符串,请使用 Scanner 如果要分析流中特定类型的令牌。

    2. 扫描仪 可以使用自定义分隔符使用标记化,并将流解析为原始数据类型,而 缓冲区读取 只能读取和存储字符串。

    3. 缓冲区读取 是同步的,而 扫描仪 不是。使用 缓冲区读取 如果使用多线程。

    4. 扫描仪 隐藏IOException while 缓冲区读取 立即抛出。

        5
  •  17
  •   roottraveller    7 年前

    我建议使用 BufferedReader 用于阅读文本。 Scanner 兽皮 IOException 虽然 缓冲区读取 立即抛出。

        6
  •  7
  •   dhS    8 年前

    以下是BufferedReader和扫描仪之间的区别

    1. BufferedReader只读取数据,但扫描器也解析数据。
    2. 只能使用BufferedReader读取字符串,但可以读取int, 使用扫描仪进行长距离或浮动。
    3. BufferedReader比扫描程序旧,它存在于JDK 1.1中,而 在JDK5版本上添加了扫描仪。
    4. BufferedReader的缓冲区大小比1KB大(8KB) 扫描仪。
    5. BufferedReader更适合读取长字符串文件 而扫描器更适合读取来自 命令提示符。
    6. BufferedReader已同步,但扫描仪未同步,这意味着 无法在多个线程之间共享扫描仪。
    7. BufferedReader比扫描器快,因为它不花费时间 关于句法分析
    8. BufferedReader比扫描器快一点
    9. 根据这些要点,我们可以做出选择。

    谢谢

        7
  •  6
  •   mfaani    8 年前

    主要区别:

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

    打印以下输出:

     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:

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

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

    通常,每个读卡器发出的读请求都会导致相应的读请求由底层字符或字节流发出。因此,建议将bufferedreader包装在任何read()操作可能代价高昂的读卡器上,例如filereaders和inputstreamreaders。例如,

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

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

    来源: Link

        8
  •  6
  •   Raman Gupta    7 年前

    两者之间的差异 缓冲区读取 扫描仪 如下:

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

      缓冲区读取 :

       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();
      
        9
  •  3
  •   manisha mulchandani    9 年前

    在Java中输入输入的方式有很多种:

    1)bufferedreader 2)scanner 3)命令行参数

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

    其中scanner是一个简单的文本扫描器,可以使用正则表达式解析基元类型和字符串。

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

    有关更多信息,请参阅:

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

        10
  •  1
  •   KNU    11 年前

    下面的答案摘自 Reading from Console: JAVA Scanner vs BufferedReader

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

    扫描器将给定的输入视为令牌。BufferedReader只是逐行读取给定的字符串输入。扫描它自己提供的解析功能与nextTint()、nextFloat()一样。

    但是,其他的区别是什么?

    • 扫描器将给定的输入视为令牌。作为流行/字符串的BufferedReader
    • 扫描器用regex标记给定的输入。使用BufferedReader必须编写额外的代码
    • 缓冲读卡器比扫描仪快*2号点
    • 扫描仪未同步,BufferedReader已同步

    扫描仪随JDK版本1.5更高版本提供。

    什么时候应该使用扫描仪或缓冲读卡器?

    看看它们之间的主要区别,一个使用标记化,另一个使用流线。当您需要分析功能时,请改用scanner。但是,我更喜欢缓冲阅读器。当需要读取文件时,请使用BufferedReader,因为它在读取文件时使用Buffer。或者可以使用BufferedReader作为扫描仪的输入。

        11
  •  0
  •   Roman    15 年前
    1. BufferedReader可能会为您提供更好的性能(因为扫描器基于inputStreamReader,look sources)。 UPS,用于读取使用NIO的文件。当我针对大文件测试NIO性能和BufferedReader性能时,NIO显示出更好的性能。
    2. 要读取文件,请尝试apache commons io。
        12
  •  0
  •   thisismydesign    8 年前

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