[英]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”。
您的示例代码中存在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.