Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过HttpURLConnection和wget下载的相同PDF文件不同_Java_Pdf_Encoding_Stream - Fatal编程技术网

Java 通过HttpURLConnection和wget下载的相同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

我正在通过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 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框架。但是如果我在没有库的情况下逐字节写入,结果是一样的。上半部分还是下半部分是正确的数据?下半部分是正确的。