我已经尝试在IE和Firefox中查看applet,并且出现了损坏的文件。有趣的是,当我尝试在Safari(Windows版)中查看applet时,文件实际上是正常的!我知道JVM可能不同,但我仍然感到困惑。我编译的是Java 1.5。JVM是1.6。下面是读取文件的代码片段。
public static ByteBuffer getAsByteArray(URL url) throws IOException {
ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
URLConnection connection = url.openConnection();
int contentLength = connection.getContentLength();
InputStream in = url.openStream();
byte[] buf = new byte[512];
int len;
while (true) {
len = in.read(buf);
if (len == -1) {
break;
}
tmpOut.write(buf, 0, len);
}
tmpOut.close();
ByteBuffer bb = ByteBuffer.wrap(tmpOut.toByteArray(), 0,
tmpOut.size());
//Lines below used to test if file is corrupt
//FileOutputStream fos = new FileOutputStream("C:\\abc.pdf");
//fos.write(tmpOut.toByteArray());
return bb;
}
我一定是漏掉了什么,一直在努力思考解决方法。非常感谢任何帮助。谢谢。
编辑: 为了进一步阐明我的情况,在使用代码片段读取文件之前和之后的差异在于,我输出后读取的文件比原始文件小得多。打开它们时,它们不能被识别为.pdf文件。没有抛出我忽略的异常,并且我尝试过刷新也无济于事。
这个代码片段在Safari中可以工作,这意味着文件被完整地读取,大小没有区别,并且可以用任何.pdf阅读器打开。在IE和Firefox中,文件总是损坏的,大小始终相同较小。
我监视 len 变量(读取一个59kb的文件时),希望看到每次循环读取多少字节。在IE和Firefox中,在18kb处,in.read(buf)返回-1,就好像文件已经结束了。Safari不会这样做。
我会继续努力,非常感谢迄今为止提供的所有建议。