2

我编写了以下代码来从服务器下载一些文件,但问题是这段代码没有读取完整的响应(inputStream)。文件大小为 7.5 MB,而我每次获得 5.5 MB,当然 adobe reader 抱怨文件已损坏。这是代码

import java.net.URLConnection;
public class Downloader {
URL url;
public Downloader(){
    try {

        url = new URL("https://d396qusza40orc.cloudfront.net/algs4partI/slides%2F13StacksAndQueues.pdf");
        FileOutputStream outStream;
        ObjectOutputStream oStream;
        try {
            URLConnection con = url.openConnection();
            InputStream inStream = con.getInputStream();
            outStream = new FileOutputStream("data.pdf");
            oStream = new ObjectOutputStream(outStream);
            int bytesRead;
            int totalBytesRead = 0;
            byte[] buffer = new byte[100000];
            while((bytesRead = inStream.read(buffer)) > 0){

                //outStream.write(buffer, 0 , bytesRead);
                oStream.write(buffer, 0, bytesRead);
                buffer = new byte[100000];
                totalBytesRead += bytesRead;
            }
            System.out.println("Total Bytes read are = " + totalBytesRead);
            oStream.close();
            outStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
public static void main(String[] args){
    Downloader d = new Downloader();
}

}

有什么想法我在这里做错了吗?提前致谢。

4

3 回答 3

1

InputStream您从 URL 连接获得的数据并不能保证所有字节都立即到达。它们是通过网络传输的,因此您的阅读速度可能高于您的网络。方法read()返回当前执行该方法时已读取的字节数。如果它返回 0,则该信息可能目前不可用,但稍后将可用。

方法read()返回 -1 以指示流结束。底线:将> 0您的if声明更改为>= 0.

于 2013-04-15T15:42:25.943 回答
1

ObjectOutputStream当您不序列化 java 对象时,您不想使用。

取消注释该行

//outStream.write(buffer, 0 , bytesRead);

并删除

oStream.write(buffer, 0, bytesRead);

所以:

while((bytesRead = inStream.read(buffer)) > 0){

    outStream.write(buffer, 0 , bytesRead);           
    buffer = new byte[100000]; // this line is useless
    totalBytesRead += bytesRead;
}

ObjectOutputStream彻底摆脱。您的文件长度为 5.25 MB(5,511,685 字节),而不是 7.5 MB。

于 2013-04-15T15:49:56.080 回答
0

问题是您正在使用 ObjectOutputStream。这以 Java 对象序列化格式对输出进行编码,这不是 PDF 阅读器所期望/需要的。

使用平原FileOutputStream,它应该工作。

于 2013-04-15T15:51:23.053 回答