2012-03-04 33 views
1

我上傳了一個JAR文件,該文件在我的計算機上的大小爲21 KB,可以上傳到網站。我發現直接鏈接到該JAR文件,並創建一個InputStream該文件:Java:意外的InputStream行爲

URL url = new URL("addresstofile"); 
InputStream stream = url.openStream(); 

它可以預計,在流中可用的字節數是〜21,000點。但是,可用金額是7,048。在嘗試調試時,我將這些7,048字節保存在一個字節數組中,然後將這些字節寫入一個擴展名爲「.jar」的臨時文件中。我將這些類提取到JAR文件中(即7 KB;原文是21 KB)。除了我注意到嵌套類不存在之外,大多數類都在那裏。我不確定這是爲什麼 - 這只是一個巧合,InputStream只是在那裏刪除,或者是否存在嵌套類的一些特殊異常?

爲什麼InputStream表現得這麼奇怪? 謝謝!

@Neil:This Works!非常感謝!

+0

流只在對'read()'的調用返回-1時結束。忽略'available()'方法。這真的沒有多大用處。 – erickson 2012-03-04 22:13:38

回答

2

在您提供的代碼的修改版本中,問題在於比較。在與-1進行比較之前,不要將'b'投射到int 之前。如果你這樣做,那麼如果流中的一個字節碰巧是255,那麼你將無法區分這個字節和流結束。

因此,在read()返回的int上與-1進行比較。然後,如果它是而不是 -1,將該值轉換爲一個字節並將其放入數組(或其他)。

int b; 
while ((b = stream.read()) != -1) 
{ 
    data[length++] = (byte) b; 
} 
+0

非常好!這工作! – 2012-03-04 22:50:57

1

在輸入流上調用available()會告訴您現在可以讀取多少個字節 - 對於網絡I/O不一定是整個文件,最有可能是在本地套接字中緩衝的內容。循環並繼續嘗試。

0

將預期的字節流 中可用的量會〜21000

爲什麼?

你怎麼可能知道可以被無阻塞地讀取的字節數是21,000?

+0

因爲我的電腦上的文件是21 KB。 – 2012-03-05 00:41:49

+0

@MartinTuskevicius所以?你怎麼知道I/O系統可以不受阻塞地讀取所有內容?我的問題是爲了讓你考慮available()方法的* actual *定義,並意識到它沒有被指定返回流的總長度。事實上,在Javadoc中有一個具體的警告。 – EJP 2012-03-05 00:44:25