2017-08-03 67 views
1

我学习Java IO和Socket,并得到了由哪些呢socket.getInputStream()实际上返回迷茫......为什么java.net.SocketInputStream不存在?

InputStream is = socket.getInputStream(); 
System.out.println(is.getClass().getName()); 

由于InputStream的是一个抽象类,socket.getInputStream()必须返回一个实例化InputStream的子类。我用上面的代码中获得实际的类名,但is.getClass()的getName()原来是

java.net.SocketInputStream 

我试图导入这个类在Eclipse中并没有发现这个类.. 。

那么究竟发生了什么?我误解了Java的某些部分吗?

+0

如果你读的javadoc,你会看到*直接已知子类: 的AudioInputStream,ByteArrayInputStream的,的FileInputStream,FilterInputStream中,为InputStream,ObjectInputStream的,PipedInputStream的,的SequenceInputStream,StringBufferInputStream的* –

回答

4

该级别为package-private。您不能直接从java.net包以外引用它。

+0

有没有什么办法,我看到的源代码这个班? –

+2

@JingHe当然,它的源代码zip。它通过'FileDescriptor'构造函数足够有趣地扩展了'FileInputStream',并且它有一些东西来关闭套接字以及流。否则没有任何兴趣在那里,一起前进。 – EJP

+0

明白了。非常感谢! –

2

我试图导入这个类在Eclipse中并没有发现这个类...

类存在,但它是包私人而已,所以公开。 这意味着您只能在班级也在同一个包中时使用它(java.net)。这里是access controls的小概述。

它明显在包java.net内,并且被称为SocketInputStream。这是一个普通的课程,从FileInputStream延伸。

这里是源代码:SocketInputStream at GrepCode

这里是documentation。引用它:

此流扩展FileInputStream以实现SocketInputStream。请注意,这个类不应该是公共的。