【问题标题】:what are the benefits of BufferedReader over ScannerBufferedReader 比 Scanner 有什么好处
【发布时间】:2013-01-12 11:04:50
【问题描述】:

这里有一段关于图中深度优先搜索的代码。 谁知道为什么在这段代码中使用了 bufferedReader 类? 为什么不使用 nextInt 函数呢? 它的特权是什么? 是为了加快处理速度吗? 谢谢:)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Graph
{
int g[][];
int v,e;
int visited[];
void createGraph()throws IOException
{
    int a,b;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("\n Enter Number Of Vertices = ");
    v=Integer.parseInt(br.readLine());
    System.out.print("\n Enter Number Of Edges = ");
    e=Integer.parseInt(br.readLine());  
    g=new int[v+1][v+1];
    for(int i=1;i<=e;i++)
    {
        System.out.print("\n Enter Edge Infomation ");
        System.out.print("\n From =");
        a=Integer.parseInt(br.readLine());
        System.out.print("\n To =");
        b=Integer.parseInt(br.readLine());  
        g[a][b]=g[b][a]=1;
    }
}
void callDFS()
{
    visited = new int[v+1];
    dfs(1);
}   
void dfs(int k)
{
    System.out.print(k + "\t");
    visited[k]=1;
    for(int i=1;i<=v;i++)
    {
        if(g[k][i] !=0 && visited[i]!=1)
        dfs(i);
    }
}
}
class DFS
{
public static void main(String args[])throws IOException
{
    Graph g = new Graph();
    g.createGraph();
    g.callDFS();
}
}

【问题讨论】:

  • 这样就可以检测到无效整数了吗?
  • 你为什么在这里问?为什么不问问写它的人?你在这里得到的只是猜测,例如,也许作者不知道 Scanner,或者当时没有它,或者不在乎,或者出于多种可能的原因更喜欢 BufferedReader比如@fge的。没有建设性。
  • @EJP 您可以将其视为“BufferedReader 与 Scanner 相比有什么好处
  • @JanDvorak I 我们都可以猜到 OP 的真正含义。我更喜欢以书面形式处理文本。他问为什么。
  • 看起来该代码是为一次性从 System.in 中读取大量行而设计的。就像您将文件的内容复制并粘贴到控制台一样。缓冲输入流读取器始终可以提高性能。

标签: java java.util.scanner bufferedreader


【解决方案1】:

这是您打算如何使用流的问题。存在用于简单和线程化应用程序的缓冲读取器。这是由于扫描仪缺乏线程安全性。

我想你会从这个问题Scanner vs. BufferedReader得到更多的信息

【讨论】:

    【解决方案2】:

    可能,当编写此代码时,Scanner 类不存在(实际上 java 1.4 没有 Scanner 类),或者可能编写此代码的人只是更喜欢使用 BufferedReader 的 readLine 方法而不是使用 Scanner.nextLine( ) 方法,我看不到有关您的问题的其他解释

    【讨论】:

    • 嗨,Harlandarka,您的意思是它也可以与 Scanner 的方法一起使用?
    • @Shr723 Scanner 也可以工作(除了它默认也接受空格作为分隔符,而前者需要换行符)。
    • 我并不是说它可能适用于扫描仪方法,我的意思是它绝对适用于 Scanner.nextLine 方法,因为它需要用户输入从行开始到行结束(\r、\n 或两者兼有)
    • @JanDvorak Scanner 接受空格而不是换行符仅当您使用 Scanner.next 方法时,如果您使用 Scanner.nextLine 它接受换行符分隔符
    【解决方案3】:

    BufferedReader 更简单(这使得它更高效),但它也是一个更清晰的选择,表明您打算使用 BufferdReader 提供的功能。即readLine() 是主要的。

    简而言之,如果您有BufferedReader,您就知道它只会读取行。如果您使用Scanner,则意味着您可能会或很多人不会阅读更复杂的内容。

    顺便说一句:

      Integer.parseInt(br.readLine())
    

      scanner.nextInt();
    

    虽然在菜鸟开发人员中通常会忽略区别,但它们并不相同。出于这个原因,我更喜欢第一个例子。不同之处在于新行的处理方式。

    【讨论】:

    • 如果你使用 Scanner.nextLine() 你做的和 BufferedReader.readLine() 一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2023-03-18
    • 2013-07-12
    • 2020-01-14
    相关资源
    最近更新 更多