我正在使用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) {
}
}
答案 0 :(得分:3)
您展示的代码会覆盖文件,无论它是否为zip文件。 ZipOutputStream
不关心现有数据。任何面向流的API都不会。
我会推荐
使用ZipOutputStream
创建新文件。
使用ZipInputStream
将现有条目复制到新文件。
添加新条目。
将旧文件替换为新文件。
希望在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");
}
}