Java.util.zip添加新文件会覆盖整个jar吗?

时间:2013-07-06 07:42:21

标签: java configuration jar zip

我正在使用java.util.zip将一些配置资源添加到jar文件中。 当我调用addFileToZip()方法时,它会完全覆盖jar,而不是将文件添加到jar中。为什么我需要将配置写入jar是完全无关紧要的。我不想使用任何外部API。

编辑:jar没有在VM中运行,org.cfg.resource是我正在尝试保存文件的包,该文件是标准文本文档,正在编辑的jar包含正确的信息使用方法。

我的代码:

public void addFileToZip(File fileToAdd, File zipFile)
{
    ZipOutputStream zos = null;
    FileInputStream fis = null;
    ZipEntry ze = null;
    byte[] buffer = null;
    int len;

    try {
        zos = new ZipOutputStream(new FileOutputStream(zipFile));
    } catch (FileNotFoundException e) {
    }

    ze = new ZipEntry("org" + File.separator + "cfg" + 
            File.separator + "resource" + File.separator + fileToAdd.getName());
    try {
        zos.putNextEntry(ze);

        fis = new FileInputStream(fileToAdd);
        buffer = new byte[(int) fileToAdd.length()];

        while((len = fis.read(buffer)) > 0)
        {
            zos.write(buffer, 0, len);
        }           
    } catch (IOException e) {
    }
    try {
        zos.flush();
        zos.close();
        fis.close();
    } catch (IOException e) {
    }
}

1 个答案:

答案 0 :(得分:3)

您展示的代码会覆盖文件,无论它是否为zip文件。 ZipOutputStream不关心现有数据。任何面向流的API都不会。

我会推荐

  1. 使用ZipOutputStream创建新文件。

  2. 使用ZipInputStream

  3. 打开现有内容
  4. 将现有条目复制到新文件。

  5. 添加新条目。

  6. 将旧文件替换为新文件。


  7. 希望在Java 7中我们得到Zip File System,这将为您节省大量工作。

    我们可以直接写入zip文件中的文件

    Map<String, String> env = new HashMap<>(); 
    env.put("create", "true");
    Path path = Paths.get("test.zip");
    URI uri = URI.create("jar:" + path.toUri());
    try (FileSystem fs = FileSystems.newFileSystem(uri, env))
    {
        Path nf = fs.getPath("new.txt");
        try (Writer writer = Files.newBufferedWriter(nf, StandardCharsets.UTF_8, StandardOpenOption.CREATE)) {
            writer.write("hello");
        }
    }