我正在尝试通过Linux上的Java程序将文本文件添加到zip存档中。该程序生成一个进程(使用java.lang.Process)来执行命令行“zip -j .zip .txt”,读取生成进程的输出和错误流,并等待使用waitFor()完成进程。虽然程序似乎运行良好(生成的进程退出,退出代码为0,表示zip命令行已成功执行)并且输出和错误流的输出读数未指示任何错误,但在程序结束时,zip存档不会总是包含应该添加的文件。这个问题不会一直发生(即使使用相同的现有存档和文件添加) - 偶尔(可能一次尝试4次),发现zip已正确更新。奇怪的是,当程序通过Eclipse调试器模式运行时,问题根本不会发生。关于为什么会出现这个问题以及如何解决这个问题的任何指示都会有所帮助。谢谢!
以下是代码段。该程序调用addFileToZip(File,File,String):
public static void addFileToZip(final File zipFile, final File fileToBeAdded,
final String fileNameToBeAddedAs) throws Exception {
File tempDir = createTempDir();
File fileToBeAddedAs = new File(tempDir, fileNameToBeAddedAs);
try {
FileUtils.copyFile(fileToBeAdded, fileToBeAddedAs);
addFileToZip(zipFile, fileToBeAddedAs);
} finally {
deleteFile(fileToBeAddedAs);
deleteFile(tempDir);
}
}
public static void addFileToZip(final File zipFile, final File fileToBeAdded) throws Exception {
final String[] command = {"zip", "-j", zipFile.getAbsolutePath(), fileToBeAdded.getAbsolutePath()};
ProcessBuilder procBuilder = new ProcessBuilder(command);
Process proc = procBuilder.start();
int exitCode = proc.waitFor();
/*
* Code to read output/error streams of proc and log/print them
*/
if (exitCode != 0) {
throw new Exception("Unable to add file, error: " + errMsg);
}
}
答案 0 :(得分:1)
确保没有其他进程锁定zip文件以进行写入,或者将要添加的文件锁定以供读取。如果要生成要添加的文件,请确保在生成zip实用程序之前刷新并关闭流。
答案 1 :(得分:1)
我正在尝试通过Linux上的Java程序将文本文件添加到zip存档。
使用java.util.zip API,其中:
提供用于读取和编写标准ZIP和GZIP文件格式的类。
如果您打算坚持使用Process
来执行此操作,请确保实施所有 When Runtime.exec() won't的建议。