[英]getResourceAsStream returns HttpInputStream not of the entire file
我有一個帶有applet的Web應用程序,它將把與applet一起打包的文件復制到客戶端計算機上。
當我將其部署到Web服務器並使用時:InputStream in = getClass()。getResourceAsStream(“ filename”);
對於我嘗試的每個文件,in.available()始終返回8192字節的大小,這意味着該文件在復制到客戶端計算機時已損壞。
InputStream的類型為HttpInputStream(sun.net.protocol.http.HttpUrlConnection $ httpInputStream)。 但是,當我在applet Viewer中測試applet時,文件被很好地復制,返回的InputStream類型為BufferedInputStream,具有文件的字節大小。 我猜想,當在文件系統中使用getResourceStream時,將使用BufferedInputStream;而在使用HTTP協議時,將使用HttpInputStream。
如何完全復制文件,HttpInputStream是否有大小限制? 非常感謝。
in.available()
告訴您可以無阻塞地讀取多少個字節,而不是可以從流中讀取的字節總數。
這是從org.apache.commons.io.IOUtils
將InputStream
復制到OutputStream
的示例:
public static long copyLarge(InputStream input, OutputStream output)
throws IOException {
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
long count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
對於我嘗試的每個文件,in.available()始終返回8192字節的大小,這意味着該文件在復制到客戶端計算機時已損壞。
這一點都不意味着!
in.available()
方法返回不阻塞即可讀取的字符數。 它不是流的長度。 通常,除了讀取(或跳過)流中的所有字節外,無法確定InputStream的長度。
(您可能已經觀察到, new FileInputStream("someFile").available()
通常會為您提供文件大小。但是該行為不受規范保證,對於某些類型的文件(可能對於某些類型的文件)肯定是不正確的)文件系統。獲取文件大小的更好方法是new File("someFile").length()
,但在某些情況下甚至無效。)
有關復制整個流內容的示例代碼,請參見@tdavies答案。 也有第三方圖書館可以做這種事情。 例如org.apache.commons.net.io.Util 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.