我正在使用带有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的大小是否有限? 非常感谢。
答案 0 :(得分:3)
in.available()
告诉您可以不阻塞地读取多少字节,而不是您可以从流中读取的总字节数。
以下是从InputStream
复制OutputStream
到org.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