java - System.in 和 Scanner 对象

标签 java input java.util.scanner system bufferedinputstream

我无法理解 System.in 的作用。我所理解的只是它是 System 类中的一个数据字段,它的声明是:

public static final InputStream in

它已被声明为最终版本,因此无法更改。
正如 Oracle 源代码中提到的,他们说“in”是“标准”输入流。该流已打开并准备好提供输入数据。通常,此流对应于键盘输入或主机环境或用户指定的另一个输入源。
这到底是什么意思?

当我编写以下代码时:

Scanner input = new Scanner(System.in);

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

另一点是,当我尝试打印System.in时,我最终得到如下输出:

java.io.BufferedInputStream@15db9742

谁能解释一下整个过程以及System.inScanner类的确切工作是什么!

最佳答案

System.inBufferedInputStream ,这样一个Stream可以是任何输入流(例如网络套接字或文件),也可以是标准输入 channel stdin .

stdin是你在命令行中输入的内容,所以显然,它没有显示任何内容。

当您创建Scanner时如您的问题所示,您将标准输入 channel 提供给 Scanner ,但扫描仪在收到要求之前不会执行任何操作。扫描仪是一个包装器:一种可以更轻松(更方便)地解析来自 stdin 的输入的构造。 。它不提供额外的功能,您可以自己完成扫描仪所做的所有事情,但如果您想解析例如 stdin 中的整数,那么使用扫描仪会更容易。 .

因此,当您键入:

Scanner sc = new Scanner(System.in);
int val = sc.nextInt();
System.out.println(2*val);

它将等待,直到您输入一行,将其解析为整数并在标准输出 channel 上打印输入值的 double 值 ( stdout )。

<小时/>

一些结论:

System.in is not final, you can use System.setIn to set another input stream as the standard input string. For instance a file or a network socket. The default System.in can also take input from for instance a file or a pipe if you for instance call the program as java -jar program.jar < inputfile.

关于java - System.in 和 Scanner 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667599/

相关文章:

java - 如何使用 try 和 catch 继续循环以获得正确的输入?

java - 如何逐行读取标准输入?

java - jackson :将未初始化的集合字段序列化为空

java - 如何从 GXT ColumnConfig 中的另一个 EntityProxy 获取数据?

鼠标悬停时 jquery 输入值发生变化

python - 在 python3 中检测到输入之前如何执行某些操作?

Java Scanner 分隔符不会分割最后一部分

Java - 扫描仪导致循环运行两次

java - 如何将ArrayList中的元素分组并分成三个List

java - 独立tomcat中的Spring Boot日志文件以XML格式保存