【问题标题】:Java: Where is InputStream's read() method implemented when reading from System.inJava:从 System.in 读取时,InputStream 的 read() 方法在哪里实现
【发布时间】:2012-12-03 09:36:00
【问题描述】:

抽象类InputStream 表示子类需要实现方法read(),该方法读取one byte,然后将其转换为unsigned int。

System.in 是 InputStream,我可以这样做:

 int i = System.in.read();

我的问题是.. 这种方法在哪里实现?它是如何工作的?也许是一个奇怪的问题,但我试图找出幕后发生的事情,因为我使用的是 InputStream 类的对象而不是它的子类之一,所以我想知道实际方法在哪里实现以及它为什么起作用。 ..

【问题讨论】:

    标签: java inputstream system.in


    【解决方案1】:

    System.in 是 一个 InputStream 的实现,它实现了 read 方法。

    如果您查看System 的源代码,您会发现它实际上是一个FileInputStream 打开文件句柄0(这是标准输入流)。但这并不重要。您唯一需要知道的是您可以从中读取。如果它是 FileInputStream、StringInputStream 或其他原生 InputStream,则无关紧要。这就是接口的全部意义所在。大多数情况下,您可以只针对接口进行编程,而不必担心具体的实现。

    【讨论】:

    • 那么有人会说 InputStream 类的子类和实现都必须实现该方法吗?
    • System.in 不是任何东西的实现。它是扩展 InputStream 的类的对象的实例。
    • 啊哈.. 实际类本身不是 InputStream,它只是扩展 InputStream 的东西吗?知道了!谢谢..对不起,如果这是一个愚蠢的问题...
    • 我将此作为答案发布,并提供了更多详细信息。 NP
    • @Isaac:因此,如果 System.in 是扩展 InputStream 的类的对象的实例,则该类对象的实例是 InputStream (implements InputStream) 的实现。在您看来,为什么说存储在 System.in 中的实例是 InputStream 的实现是错误的?
    【解决方案2】:

    InputStream 是System.in 的类型,而不是它的类(因为InputStream 是抽象的,不能直接实例化)。

    考虑:

    Object obj = "123";
    

    变量obj的类型是Object,但是obj引用的实例是String的实例。当在obj 上调用toString() 时,使用的是String 中的实现,而不是Object 中的实现。

    System.in 也是如此。存储在那里的实际实例将是InputStream 的某个子类,它将有自己的任何抽象方法的实现。如果你想知道存储在System.in中的实例的类,那么你可以调用System.in.getClass()。

    【讨论】:

    • 酷!就我而言,它是一个 BufferedInputStream .. 明白了这个概念!谢谢:)
    【解决方案3】:

    幕后发生的事情是这样的:System 类的in 属性在运行时被分配了对某个类X 的对象的引用。该类X 扩展了InputStream,因此它实现了read 方法。

    你不能确定(意思是,它没有在任何地方指定)X 是什么类;你只知道它扩展了InputStream。不同的 JDK 可能使用不同的类。

    【讨论】:

      【解决方案4】:

      什么是 System.in.read() ?

      1) System.in 返回static InputStream in

      首先 InputStream 类是一个 abstract class 及其 read method also abstract,这意味着可能有 n 个read 方法的实现。

      那么幕后发生了什么?

      System.in 返回 InputStream class on runtime 的实例,即扩展 InputStream 的类,因为我们知道所有字节流类都扩展 InputStream ,因此它可以是任何扩展 InputStream 的类班级。 现在read method is called from that class which it actually extending InputStream.

      您始终可以通过调用 System.in.getClass()

      来检查为 InputStream 类提供的实例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-24
        • 2011-11-03
        • 2011-10-26
        相关资源
        最近更新 更多