Java:从System.in读取时InputStream的read()方法在哪里实现

问题描述 投票:1回答:4

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

[System.inInputStream,我可以这样做:

 int i = System.in.read();

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

java inputstream system.in
4个回答
1
投票

[InputStreamSystem.in的类型,而不是它的类(因为InputStream不能抽象,所以不能直接实例化。]

考虑:

Object obj = "123";

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

System.in也是一样。存储在其中的实际实例将具有InputStream的某个子类,该子类将具有其自己的任何抽象方法的实现。如果您想知道存储在System.in中的实例的类,则可以调用System.in.getClass()


2
投票

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

如果查看System的源代码,您会发现它实际上是打开文件句柄0(这是标准输入流)的FileInputStream。但这并不是真的相关。您需要知道的唯一一件事就是您可以阅读它。它是FileInputStreamStringInputStream还是其他一些本机InputStream都无关紧要。这就是界面的重点。您几乎可以只针对接口进行编程,而不必担心具体的实现。


1
投票

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

您无法确定(含义,在任何地方都没有指定)X类是什么;您所知道的是它扩展了InputStream。不同的JDK可能使用不同的类。


1
投票

什么是System.in.read()?

1)System.in返回static InputStream in

首先是InputStream类是具有abstract classread method also abstract,这意味着read方法可能有n种实现。

那么幕后发生了什么?

[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类提供的实例。

© www.soinside.com 2019 - 2024. All rights reserved.