繁体   English   中英

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

[英]Corrupt file when using Java to download file

此问题似乎发生不一致。 我们正在使用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

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

我猜想您对getContent和BufferedInputStream所做的操作已将文件视为ascii文件,该文件已将换行符或回车符转换为回车符+换行符(0x0d0a),这混淆了ObjectInputStream(期望序列化数据对象)。

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

尝试在网址末尾附加“; type = I”。

为什么使用ObjectInputStream读取它?

根据javadoc:

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

该错误可能是由于您没有使用ObjectOutputStream编写它而引起的。

尝试仅通过FileInputStream读取它。

这是二进制示例 (尽管不是最有效的方法)

这是另一个用于文本文件的文件。

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

  1. 您不仅将输入视为字节
  2. 您无需一次将整个对象拖入内存
  3. 您正在为每个读写的字节执行多个方法调用-使用基于数组的读/写!

重做:

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();

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

如果文件相同,则说明读取文件的代码有问题。

如果文件不相同,则将重点放在编写文件的代码上。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM