System.in属于哪个输入类,为什么?

时间:2015-08-17 13:37:13

标签: java inheritance io

代码

import java.io.*;

class ioTest1{
   public static void main(String args[]){
      System.out.println(System.in.getClass());
   }
}

返回System.in属于BufferedInputStream类。那是为什么?

由于课程SystemSystem.in定义为InputStream,我可以看到结果并非不可能。但为什么以前的代码不能返回从InputStream继承的另一个类,例如DataInputStream

2 个答案:

答案 0 :(得分:12)

正如评论中所解释的那样,没有什么可以阻止System.in成为DataInputStream,但鉴于BufferedInputStream是一个简洁的InputStream,包括缓冲数据(总是一个好主意),给出最通用的类​​型更有意义。

如果程序使用管道二进制数据,开发人员可以使用例如DataInputStream来包装缓冲流,如果程序正在从用户接收文本数据,则可以使用InputStreamReader

System.inBufferedInputStream,因为它不需要任何其他内容。

答案 1 :(得分:4)

简单的答案就是它的实施方式。

如果查看java.lang.System类的源代码,您将看到System.in设置为natively(请参阅Java_java_lang_System_setIn0)。

不同的JVM实现者可以使用他们喜欢的任何InputStream实现。在您的情况下,大概使用BufferedInputStream来提高效率。