getResourceAsStream返回HttpInputStream而不是整个文件

时间:2010-05-20 03:10:14

标签: java inputstream

我正在使用带有applet的Web应用程序,该applet将使用applet打包的文件复制到客户端计算机。

当我将它部署到webserver并使用: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的大小是否有限? 非常感谢。

2 个答案:

答案 0 :(得分:3)

in.available()告诉您可以不阻塞地读取多少字节,而不是您可以从流中读取的总字节数。

以下是从InputStream复制OutputStreamorg.apache.commons.io.IOUtils的示例:

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

答案 1 :(得分:1)

  

对于我尝试过的每个文件,in.available()总是返回8192字节的大小,这意味着文件在复制到客户端计算机时已损坏。

这根本不意味着!

in.available()方法返回可以不受阻塞地读取的字符数。它不是流的长度。通常,除了读取(或跳过)流中的所有字节之外,无法确定InputStream的长度。

(您可能已经注意到new FileInputStream("someFile").available()通常会为您提供文件大小。但该规范保证,对于某些类型的文件肯定是不正确的,并且可能对于某些类型的文件系统也是如此。获得文件大小的更好方法是new File("someFile").length(),但即使这样在某些情况下也不起作用。)

有关复制整个流内容的示例代码,请参阅@tdavies answer。还有第三方图书馆可以做这种事情;例如org.apache.commons.net.io.Util