System.in 是如何运作的?

How System.in works?

我对系统 class 具有 InputStream 类型的静态字段 in 的位置产生了疑问。 InputStream 是一个抽象 class。 Java 文档说,System.in stream is already open and ready to supply input data.

抽象 class 在实现之前无法初始化。但是输入流已经被各种 class 实现了,比如 AudioInputStream、ByteArrayInputStream、FileInputStream、FilterInputStream 等。所以当我们使用 System.in 时,哪个 class 的对象被实例化了?或者如果没有,它会创建任何匿名 class ?

请分享您的观点..!

System.in 关联的对象的 class 是 InputStream 的子class。没有详细说明1.

但我们可以测试一下:

$ cat Test.java
public class Test {
  public static void main(String[] args) {
    System.out.println(System.in.getClass());
  }
}
$ javac Test.java 
$ java Test 
class java.io.BufferedInputStream
$ 

当然,Java 的一个版本到下一个版本可能会有所不同。以上是针对Java 8.


1 - 由于未指定用于System.in的class,因此不建议编写依赖于经验观察的代码 似乎总是使用相同的 class。但是,我不希望提供 Java 实现的人更改此细节......因为人们 可能 对 class 有硬连线知识进入他们的代码。