System.in和Scanner对象

时间:2014-12-27 13:16:55

标签: java input system bufferedreader println

我有一个问题要理解System.in特定的工作,我所理解的是它是System类中的一个数据字段,它的声明是

public static final InputStream in

它已被宣布为最终版,因此无法更改, 正如在Oracle源代码中提到的那样,他们说“in”是“标准”输入流。此流已打开并准备好提供输入数据。通常,此流对应于键盘输入或主机环境或用户指定的其他输入源。

这究竟意味着什么?

当我写下面的代码时:

Scanner input = new Scanner(System.in);

扫描程序对象已准备好扫描System.in中的内容,但CMD上没有显示任何内容

另一点是,当我尝试打印System.in时,我最终输出了这样的输出

java.io.BufferedInputStream@15db9742

任何人都可以解释整个过程以及System.in和Scanner类的确切工作!

2 个答案:

答案 0 :(得分:3)

System.inBufferedInputStream,这样的Stream可以是任何输入流(例如网络套接字或文件),也可以是标准输入通道{{1} }。

stdin是您在命令行中输入的内容,因此很明显,它没有显示任何内容。

如您在问题中所示创建stdin时,您将标准输入频道提供给Scanner,但扫描仪不会做任何事情,直到被要求为止。扫描程序是包装器:一种结构,可以更轻松(更方便)解析Scanner的输入。它不能提供额外的功能,因为您可以自己完成扫描程序所做的一切,但如果您想要解析来自{{1}的整数,则使用扫描程序会更容易}。

所以当你输入例如:

stdin

它会等到您输入一行,将其解析为整数并在标准输出通道(stdin)上打印输入值的两倍。


一些结论性说明:

  

Scanner sc = new Scanner(System.in); int val = sc.nextInt(); System.out.println(2*val); 不是stdout,您可以使用System.in将另一个输入流设置为标准输入字符串。例如文件或网络套接字。   如果您将程序称为final,则默认System.setIn也可以从例如文件或管道获取输入。

答案 1 :(得分:3)

Scannerjava.util包中的一个类。

当你写Scanner sc=new Scanner(System.in)时,你正试图从"standard" input stream读取输入。主要System.in用于从控制台读取输入

扫描程序保持程序执行,直到输入到达,这就是它的意图。

您的问题是,当您打印System.in时,您的结尾会输出java.io.BufferedInputStream@15db9742这样的输出,此输出将被称为对象hash code,您很可能会得到此类输出如果您尝试打印对象。 在这里,您将获得哈希码,因为您正在尝试打印整个流。