java - 不同平台上的ZipOutputStream结果不同

标签 java servlets stream zip

我有生成 zip 输出流的代码,然后通过 servlet 的响应流发送该流。在我的 Mac 上进行开发测试时一切正常,但是,当我将代码放在我的服务器 (RHEL) 上时,zip 存档似乎已损坏。当我尝试使用 jar 列出文件的内容时,我得到:

java.util.zip.ZipException:打开 zip 文件时出错

但奇怪的是,使用 jar 提取存档是有效的(但是其他解存档程序会失败)。

为了进一步测试,我确保来 self 的 Mac 和 RHEL 的 zip 文件的内容完全相同。在这两种情况下,zip 文件的大小完全相同,但哈希值 (MD5) 不同。

正如我所说,生成 zip 文件的代码以及内容完全相同,所以我不知道发生了什么。我相当确定我的 zip 文件创建是正确的,因为它正在其中一个平台上运行。在 RHEL 服务器上生成 zip 文件时没有任何迹象表明有任何问题。

想法?感谢您的帮助。

编辑:这是代码...

// first add the kml document
ZipOutputStream stream = new ZipOutputStream(response.getOutputStream());
stream.putNextEntry(new ZipEntry("doc.kml"));
stream.write(kml.getBytes(), 0, kml.length());
stream.closeEntry();

File image = null;
byte[] bytes = null;
FileInputStream fstream = null;

// include the images for each type
File images = new File("/tmp/images");
String filename = null;

for(Type type: types) {
  filename = type.getName() + ".png";
  image = new File(images, filename);
  bytes = new byte[(int)image.length()];

  fstream = new FileInputStream(image);
  fstream.read(bytes);

  stream.putNextEntry(new ZipEntry(filename));
  stream.write(bytes);
  stream.closeEntry();

  fstream.close();
}

stream.finish();
stream.flush();
stream.close();

EDIT2:情节变得更加复杂,只要存档中只有一张图像,RHEL zip 流就可以了。希望这足以让谷歌帮助我。

最佳答案

几个问题:

  • 不要使用getBytes()将字符串转换为字节。这将使用平台字符集,不同平台上的字符集可能不同。始终使用显式字符集,例如getBytes("UTF-8")。另外,getBytes() 返回的长度与 String 的长度无关。
  • 读取文件时,不要将它们完全读入内存(这不会扩展)。使用固定大小的 byte[] 和 while 循环在 InputStream 和 OutputStream 之间进行复制。网上有数千个此代码的示例。 (或使用诸如 commons io IOUtils.copy 之类的东西)
  • 与上一点相关,InputStream.read() 有一个返回值,不要忽略它。同样,您应该在您发现的任何显示将 InputStream 复制到 OutputStream 的最佳方法的示例中看到这一点。

关于java - 不同平台上的ZipOutputStream结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951337/

相关文章:

java - Jackson 通过继承进行反序列化

java - 如何在 Java 中运行不同的线程?

java - 在 CentOS 5.10 上使用 Opscode 说明书安装 Tomcat6

java - Tomcat webapps 服务器独立吗?

java - java中未选中和选中复选框的httpservlet请求getparameter

java - XML 流 XPath 处理器算法

Android:全屏打开 Flash 视频流

c - 是否可以使用目录流重命名 C 中的文件?

java - 为什么for循环可以初始化Java中按值传递的变量

tomcat - 浏览器无法从 WEB-INF 文件夹中检索 JS 文件