3

我正在使用 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) {
    }
}
4

1 回答 1

4

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

我会推荐

  1. 使用创建新文件ZipOutputStream

  2. 打开现有的ZipInputStream

  3. 将现有条目复制到新文件。

  4. 添加新条目。

  5. 用新文件替换旧文件。


希望在 Java 7 中我们获得了Zip 文件系统,可以为您节省大量工作。

我们可以直接写入 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");
    }
}
于 2013-07-06T07:52:14.187 回答