簡體   English   中英

getResourceAsStream返回的不是整個文件的HttpInputStream

[英]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.IOUtilsInputStream復制到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM