使用Java下载文件时损坏文件

时间:2008-12-30 22:44:12

标签: java

这个问题似乎不一致。我们正在使用java applet从我们的网站下载文件,我们暂时将其存储在客户端的计算机上。

以下是我们用来保存文件的代码:

URL targetUrl = new URL(urlForFile);
InputStream content = (InputStream)targetUrl.getContent();
BufferedInputStream buffered = new BufferedInputStream(content);
File savedFile = File.createTempFile("temp",".dat");

FileOutputStream fos = new FileOutputStream(savedFile);
int letter;
while((letter = buffered.read()) != -1)
    fos.write(letter);
fos.close();

稍后,我尝试使用以下方法访问该文件:

ObjectInputStream keyInStream = new ObjectInputStream(new FileInputStream(savedFile));

大部分时间它没有问题,但偶尔我们会得到错误:

java.io.StreamCorruptedException: invalid stream header: 0D0A0D0A

这让我相信它没有正确保存文件。

5 个答案:

答案 0 :(得分:4)

我猜你用getContent和BufferedInputStream完成的操作已将文件视为ascii文件,该文件已将换行符或回车符转换为回车符+换行符(0x0d0a),这会混淆ObjectInputStream(需要序列化)数据对象。

答案 1 :(得分:1)

如果您使用的是FTP URL,则可能会以ASCII模式进行传输。

尝试将“; type = I”附加到您网址的末尾。

答案 2 :(得分:1)

为什么使用ObjectInputStream来读取它?

根据javadoc:

  

ObjectInputStream使用ObjectOutputStream反序列化原始数据和以前编写的对象。

可能错误来自于你没有使用ObjectOutputStream编写它。

尝试仅使用FileInputStream进行阅读。

这里是二进制的a sample(虽然不是最有效的方式)

这是用于文本文件的another

答案 3 :(得分:1)

您的示例代码中存在3个大问题:

  1. 您不只是将输入视为字节
  2. 你不必立刻把整个物体拉进记忆中
  3. 您正在为读取和写入的每个字节执行多个方法调用 - 使用基于数组的读/写!
  4. 这是重做:

    URL targetUrl = new URL(urlForFile);
    InputStream is = targetUrl.getInputStream();
    File savedFile = File.createTempFile("temp",".dat");
    FileOutputStream fos = new FileOutputStream(savedFile);
    
    int count;
    byte[] buff = new byte[16 * 1024];
    while((count = is.read(buff)) != -1) {
        fos.write(buff, 0, count);
    }
    fos.close();
    content.close();
    

答案 4 :(得分:0)

您也可以退回代码并检查客户端上的文件是否与服务器上的文件相同。如果你在XP机器上同时获得这两个文件,你应该能够使用FC实用程序进行比较(如果需要将其作为二进制比较运行,请检查FC的帮助,因为有一个开关)。如果你在Unix上,我不知道文件比较程序,但我确定有一些东西。

如果文件相同,那么您正在查看读取文件的代码存在问题。

如果文件不相同,请关注编写文件的代码。

祝你好运!