Java 通过HttpURLConnection和wget下载的相同PDF文件不同
我正在通过Java下载一个PDF,其中包含以下代码。Java 通过HttpURLConnection和wget下载的相同PDF文件不同,java,pdf,encoding,stream,Java,Pdf,Encoding,Stream,我正在通过Java下载一个PDF,其中包含以下代码。 下载后,我可以打开PDF没有任何错误,它也有所有的网页,但他们都是空白的 URL url = new URL(link); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); int respCode = conn.getResponseCode(); if(respCode == 200) { FileOutputStream fos = new
下载后,我可以打开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 UTIL。所以我做了一个变通方法,我认为这是完全等效的,并发布了上面的代码以保持简单 问题:在读取最后一个字节而不是从
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
中
在对这个答案进行放射线处理后,我注意到了它,并搜索了一些“将所有字节的值都展平,且大于127”的内容
OutputStream.write()
方法说“b的24个高阶位被忽略。”但是我的read()
返回的值高达65535。之后,我意识到我不是从InputStream
读取,而是从InputStreamReader
…读取,为什么要将其保存为.txt文件?还有,你从哪里得到的StreamUtils?哈哈,我没有。只是在发布前更改了名称,把它搞砸了。StreamUtils来自Spring框架。但是如果我在没有库的情况下逐字节写入,结果是一样的。上半部分或下半部分是正确的数据吗?下半部分是正确的。为什么要将其保存为.txt文件?还有,你从哪里得到的StreamUtils?哈哈,我没有。只是在发布前更改了名称,把它搞砸了。StreamUtils来自Spring框架。但是如果我在没有库的情况下逐字节写入,结果是一样的。上半部分还是下半部分是正确的数据?下半部分是正确的。