【发布时间】:2010-10-12 20:00:18
【问题描述】:
我试图弄清楚为什么这个特殊的 sn-p 代码对我不起作用。我有一个小程序,它应该读取 .pdf 并使用 pdf-renderer 库显示它,但是由于某种原因,当我读取位于我的服务器上的 .pdf 文件时,它们最终会损坏。我已经通过再次写回文件来测试它。
我尝试在 IE 和 Firefox 中查看小程序,但出现了损坏的文件。有趣的是,当我尝试在 Safari(适用于 Windows)中查看小程序时,该文件实际上很好!我知道 JVM 可能会有所不同,但我仍然迷路了。我已经在 Java 1.5 中编译。 JVM 是 1.6。读取文件的sn-p如下。
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;
}
我一定是错过了什么,我一直在努力想弄清楚。任何帮助是极大的赞赏。谢谢。
编辑: 为了进一步澄清我的情况,我阅读之前的文件与 sn-p 和之后的区别在于,我在阅读后输出的文件比原来的要小得多。打开它们时,它们不会被识别为 .pdf 文件。没有抛出我忽略的异常,并且我尝试刷新无济于事。
这个 sn-p 在 Safari 中工作,这意味着文件被完整地读取,大小没有差异,并且可以用任何 .pdf 阅读器打开。在 IE 和 Firefox 中,文件最终总是被损坏,并且大小始终相同。
我监视了 len 变量(在读取 59kb 文件时),希望查看在每个循环中读取了多少字节。在 IE 和 Firefox 中,在 18kb 处,in.read(buf) 返回 -1,就好像文件已经结束一样。 Safari 不这样做。
我会坚持下去,我很感激到目前为止的所有建议。
【问题讨论】:
-
当您说文件已损坏时,您究竟是什么意思?如果和原作比较,有什么不同?
-
请回答 Eddie 问题的第二部分。另外,contentLength 的值是否正确?