2017-08-03 64 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。請注意,這個類不應該是公共的。