我有一个问题要理解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类的确切工作!
答案 0 :(得分:3)
System.in
是BufferedInputStream
,这样的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)
Scanner
是java.util
包中的一个类。
当你写Scanner sc=new Scanner(System.in)
时,你正试图从"standard" input stream
读取输入。主要System.in
用于从控制台读取输入
扫描程序保持程序执行,直到输入到达,这就是它的意图。
您的问题是,当您打印System.in
时,您的结尾会输出java.io.BufferedInputStream@15db9742
这样的输出,此输出将被称为对象hash code
,您很可能会得到此类输出如果您尝试打印对象。
在这里,您将获得哈希码,因为您正在尝试打印整个流。