2010-05-20 49 views
0

我有一個applet的web應用程序,它將一個文件與applet一起打包到客戶端機器上。當我將其部署到web服務器並使用:InputStream in = getClass()。getResourceAsStream(「filename」);getResourceAsStream返回的HttpInputStream不是整個文件

in.available()對於我試過的每個文件都會返回8192字節的大小,這意味着文件在複製到客戶端計算機時會損壞。

InputStream的類型爲HttpInputStream(sun.net.protocol.http.HttpUrlConnection $ httpInputStream)。但是當我在applet查看器中測試applet時,文件被複製得很好,InputStream返回的是BufferedInputStream類型,它具有文件的字節大小。我猜想,當文件系統中的getResourceStream將使用BufferedInputStream,並且在http協議時,將使用HttpInputStream。

我將如何完全複製文件,是否存在HttpInputStream的大小限制? 非常感謝。

回答

3

in.available()告訴你可以不阻塞地讀取多少字節,而不是從流中讀取的總字節數。

下面是從org.apache.commons.io.IOUtils複製一個InputStreamOutputStream的示例:

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; 
} 
+0

謝謝Tdavies,我能夠複製文件。 – 2010-05-20 04:22:02

1

的in.available()總是返回一個尺寸的8192個字節用於我嘗試每一個文件,這意味着該文件是當它被複制到客戶端計算機時被損壞。

這並不意味着!

in.available()方法返回可以不阻塞地讀取的字符數。這不是流的長度。通常,除了讀取(或跳過)流中的所有字節外,沒有辦法確定InputStream的長度。

(您可能已經注意到,new FileInputStream("someFile").available()通常給你的文件大小,但這種行爲是在規範保障,肯定是不真實的某些類型的文件,並可能對某些類型的文件系統,以及。獲取文件大小的更好方法是new File("someFile").length(),但即使這樣做在某些情況下也不起作用。)

請參閱@tdavies回答例如複製整個流內容的代碼示例。還有第三方庫可以做這種事情;例如org.apache.commons.net.io.Util

+0

嗨,謝謝Stephen。 – 2010-05-20 04:21:44

相關問題