BufferedReader与Console与Scanner的区别

54

你好,我刚接触 Java,想知道在控制台中读取用户输入最佳选择是什么,据我所知有三种方式:

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

我该选哪一个?为什么是这一个而不是其他的?


4
对于任何简单的程序,只需使用Scanner。我以前从未见过使用Console,并且在处理文件之类的内容时请使用InputStream/Reader。 - lealand
3个回答

60

BufferedReader

Scanner

控制台

  • 自Java 1.6起可用
  • 抛出未经检查的异常
  • 不总是可用(例如如果输入/输出被重定向,以及在Eclipse中
  • 可以读取
  • 底层读取器可以读取单个字符和字符数组(但在行边界处停止)
  • 可以读取密码(即在不显示字符的情况下读取)

推荐:扫描仪

用于读取数字的方法非常有用(尽管要注意使用nextInt()等后面跟着nextLine())。异常未经检查,因此您无需编写样板try/catch块。


2
请阅读以下有关编程的内容,并访问https://dev59.com/j3E95IYBdhLWcg3wn_Rr?rq=1查看答案。 - KNU
小心使用Scanner,当你有新的Scanner(System.in)并关闭它时,System.in也会被关闭。如果你想在其他地方再次使用new Scanner(System.in),那么尝试读取用户输入将会抛出异常。目前我正在尝试使用JLine,它可以读取密码并打印给定的掩码。 - Michael Hegner
1
如果您混合使用nextInt()和nextLine(),则需要小心,因为nextLine()将从输入中删除换行符,但nextInt()不会! - Mangat Rai Modi
1
如果标准输出/输入被重定向,则Console不可用 || 使用Scanner进行解析是本地化 - user16320675
@user16320675 谢谢,我已经更新了我的答案,提到如果输入/输出被重定向,控制台是不可用的。Scanner的本地化是一个好点,但我认为在回答中提到它并不值得,因为BufferedReader和Console甚至不支持读取数字,所以当与它们进行比较时,本地化并不是很相关。(还要感谢@MangatRaiModi警告关于混合使用Scanner.nextInt()和nextLine(),我已经将其添加到答案中。) - tom

4

为了处理不同操作系统的控制台输入,Console类以跨平台的方式实现。所有操作系统都有一个控制台/ shell,但它们的实现方式非常不同。因此,Console类为您提供了一个Java平台无关的运行时类来访问诸如密码输入等内容。

Scanner用于从流的内容中解析标记,而BufferedReader只读取流并不执行任何特殊解析。


4

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

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

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

还可以查看下面的链接,它一定会帮助您……

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接