BufferedReader vs Console vs Scanner

Posted

技术标签:

【中文标题】BufferedReader vs Console vs Scanner【英文标题】: 【发布时间】:2013-07-12 07:14:31 【问题描述】:

您好,我是 Java 的新手,我想知道在控制台中读取用户输入的最佳选择是什么,据我所知有 3 种方法:

    Console console = System.console(); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); Scanner reader = new Scanner(System.in);

我应该选择哪一个?为什么是那个而不是另一个?

【问题讨论】:

对于任何琐碎的程序,只需使用扫描仪。我以前从未见过使用过控制台,并且在处理文件之类的东西时使用了 InputStream/Reader。 【参考方案1】:

BufferedReader

Java 1.1 起 抛出checked exceptions 可以读取single chars、char arrays和lines 快速

Scanner

Java 1.5 起 引发未经检查的异常 可以读取lines、numbers、whitespace-delimited tokens、regex-delimited tokens 难以read single characters

Console

Java 1.6 起 引发未经检查的异常 并非始终可用(例如,input/output is redirected 和 in Eclipse) 可以阅读lines Underlying reader 可以读取单个字符和字符数组(但在行边界处停止) 可以阅读passwords(即阅读时不显示字符)

推荐:扫描仪

读取数字的方法非常有用(尽管beware when using nextInt() etc. followed by nextLine())。异常是未经检查的,因此您不必编写样板的 try/catch 块。

【讨论】:

也阅读***.com/questions/2231369/…的答案 小心使用扫描仪,当您有新的Scanner(System.in) 并关闭扫描仪时,System.in 也会被关闭。如果您想再次在某处使用new Scanner(System.in),那么尝试读取用户输入将引发异常。目前我正在尝试JLine,什么可以读取密码并打印给定的掩码。 如果混合使用 nextInt() 和 nextLine() 也可以使用扫描仪,需要小心,因为 nextLine() 会从输入中删除 bnewline 字符,但 nextInt() 不会! Console 在标准输出/输入被重定向时不可用 ||使用Scanner 解析是本地化 @user16320675 谢谢,我已经更新了我的答案,提到如果输入/输出被重定向,控制台将不可用。 Scanner 的本地化是一个好点,但我认为答案中不值得一提,因为 BufferedReader 和 Console 甚至不支持读取数字,因此与它们相比,本地化并不真正相关。 (还要感谢@​MangatRaiModi 关于混合 Scanner.nextInt() 和 nextLine() 的警告,我已将其添加到答案中。)【参考方案2】:

除此之外,您还可以使用 datainputstream 等。

现在 BufferedReader 从字符输入流中读取文本,缓冲字符,以便高效读取字符、数组和行。可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

Scanner 是一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。 Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。 Scanner 用于从流的内容中解析令牌,而 BufferedReader 只是读取流,不做任何特殊的解析。

还请查看下面的链接,它一定会对您有所帮助.......

http://www.javawebtips.com/50474/

【讨论】:

【参考方案3】:

控制台类以独立于平台的方式实现,以处理不同操作系统的控制台输入。所有操作系统都有一个控制台/外壳,但它们在实现上完全不同。因此,Console 类为您提供了一个独立于 Java 平台的运行时类来访问密码输入等内容。

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

【讨论】:

以上是关于BufferedReader vs Console vs Scanner的主要内容,如果未能解决你的问题,请参考以下文章

document.write vs console.log vs innerHTML

System.console() 返回 null

VS 2010 post build,show application console

vs2005里面的console application是啥意思啊

vs2017为啥不出现”应用程序设置”窗口

使用 AWS-Console VS 以编程方式创建的启动配置