Java System.in属于哪个输入类?为什么?
代码Java System.in属于哪个输入类?为什么?,java,inheritance,io,Java,Inheritance,Io,代码 import java.io.*; class ioTest1{ public static void main(String args[]){ System.out.println(System.in.getClass()); } } 返回属于BufferedInputStream类的System.in。为什么呢 由于classSystem定义了System.in为InputStream,我可以看出结果并非不可能。但是为什么前面的代码不能返回另一个继承自Inp
import java.io.*;
class ioTest1{
public static void main(String args[]){
System.out.println(System.in.getClass());
}
}
返回属于
BufferedInputStream
类的System.in
。为什么呢
由于class
System
定义了System.in
为InputStream
,我可以看出结果并非不可能。但是为什么前面的代码不能返回另一个继承自InputStream
的类,比如DataInputStream
?正如注释中所解释的那样,没有任何东西可以阻止系统。在中成为DataInputStream
,但是考虑到BufferedInputStream
是一个包含数据缓冲的简单的InputStream
(这总是一个好主意),因此给出可能的最通用类型更有意义
然后,开发人员可以使用DataInputStream
包装缓冲流(如果程序是通过管道传输的二进制数据),或者如果程序从用户接收文本数据,则使用InputStreamReader
)
System.in
是一个BufferedInputStream
,因为它不需要其他任何东西。简单的答案是它就是如何实现的
如果您查看java.lang.System类的源代码,您将看到System.in已设置好(请参阅java\u java\u lang\u System\u setIn0)
不同的JVM实现者可以使用他们喜欢的任何InputStream实现。在您的例子中,使用BufferedInputStream
大概是为了提高效率。如果编写类的人决定选择另一个实现,它可以返回扩展InputStream
类的其他内容。BufferedInputStream
是InputStream
的子类getClass()
可以返回InputStream
的任何子类,但它返回BufferedInputStream
的原因是因为这正是它的实现方式——也就是说,在某个地方,您会找到一行,它大致表示System.in=new BufferedInputStream()
(而不是其他类型的流)。你是在问开发人员为什么选择这种类型的流吗?如果这是代表开发人员实现的问题,那么这就回答了我的问题。但是我试图理解I/O在Java中是如何工作的,我认为有这样一个指定的类实例化通用的标准输入流是很奇怪的…@ThemistoklisHaris因为InputStream
是抽象的,它必须是其中的一个子类BufferedInputStream
是一个非常合适且显而易见的选择。@Kayaman为什么BufferedInputStream
比其他类型的InputStream
更好?(这将是对这个问题的一个很好的回答;)