通过HttpURLConnection和wget下载的相同PDF文件是不同的

时间:2017-04-04 13:45:52

标签: 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 FileOutputStream(new File("foo.pdf"));

    StreamUtils.copy(conn.getInputStream(), fos);

    fos.close();
}

如果我使用浏览器或wget下载PDF,则完全没问题。 即使文件大小完全相同,但我在比较二进制文件时注意到了差异。

Binary Diff

在写入或读取流时是否需要设置一些编码?

修改
我发现了错误:

老实说:上面的代码并不完全是我正在做的,因为我有另一个问题阻止我使用一些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 ...

0 个答案:

没有答案