我使用以下代码通过Java下载PDF 下载后我可以打开PDF而没有任何错误,它也有所有页面,但它们都是空白的。
URL url = new URL(link);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int respCode = conn.getResponseCode();
if(respCode == 200) {
FileOutputStream fos = new FileOutputStream(new File("foo.pdf"));
StreamUtils.copy(conn.getInputStream(), fos);
fos.close();
}
如果我使用浏览器或wget下载PDF,则完全没问题。 即使文件大小完全相同,但我在比较二进制文件时注意到了差异。
在写入或读取流时是否需要设置一些编码?
修改
我发现了错误:
老实说:上面的代码并不完全是我正在做的,因为我有另一个问题阻止我使用一些copyStream工具。所以我做了一个解决方法,我认为它完全等效,并发布了上面的代码以保持简单。
问题:在读取最后一个字节而不是从read()
方法获得-1后,我得到一个IOException: Premature EOF
,这似乎是服务器端错误。因此,我不是复制整个流,而是逐字节地读取它并捕获异常。
int respCode = conn.getResponseCode();
if(respCode == 200) {
InputStreamReader isr = new InputStreamReader(conn.getInputStream());
int bte = 0;
try{
while((bte = isr.read()) != -1) {
zipOut.write(bte);
}
} catch(IOException e) {
if(e.getMessage().equals("Premature EOF")) { // "chunked stream ended unexpectedly"
// That's ok
} else {
throw e;
}
}
isr.close();
}
我犯的错误是将InputStream
包裹在InputStreamReader
中。
在对这个答案Blank PDF while downloading进行调整后我注意到了这一点,并搜索了“使所有字节变得高于127 ”的内容。
OutputStream.write()
方法说“ b的24个高位被忽略。”但我的read()
返回的值高达65535.之后我意识到我不是来自InputStream
,而是来自InputStreamReader
...