我和ProcessBuilder.start();有一些问题。
下面是代码的一个示例:
List<String> listOfStrings = new ArrayList<String>();
myListOfString.add("zip");
myListOfString.add("-r");
myListOfString.add(destinationPath);
myListOfString.add(newFilePath);
File zipFile = new File(workingDirectory, fileName + ".zip");
ProcessBuilder processBuilder = new ProcessBuilder(listOfStrings);
prcoessBuilder.directory(workingDirectory);
try{
Process p = processBuilder.start();
...
...
...workingDirectory已被验证为使用workingDirectory.isDirectory()的工作目录。
这个问题发生在Process p = processBuilder.start();,在那里它抛出一个IOException。
下面是堆栈跟踪:
java.io.IOException: Cannot run program "zip" (in directory "<Path to workingDirectory>"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
...
...
...workingDirectory没有指向特定的文件(例如:/path/to/,而不是/path/to/file.zip),但是它是一个有效的目录。这可能是问题所在吗?
由于项目的性质,我无法给出确切的代码,但如果输入在Process p = processBuilder.start();上崩溃,我无法想象输入有多重要,然而,这就是为什么我要伸出援手的原因,所以可能是这样的。
如果需要澄清,请告诉我。
发布于 2020-12-18 15:17:25
错误消息说,Java在当前目录或路径中找不到一个名为zip的可执行文件,如下所示:
String systemPath = System.getenv("PATH");
System.out.println("PATH="+systemPath);将启动程序修复为包含"zip“的完整路径,或修复用于Java的路径,以包含包含zip的目录。
myListOfString.add("/the/path/to/zip");或者类似的东西(取决于你的外壳/终端)
export PATH=/the/path/to:$PATH正如@Abra所建议的,在Java内部有更好的方法可以不依赖ProcessBuilder,例如:
public static void zip(Path dir, Path zip) throws IOException
{
Map<String, String> env = Map.of("create", "true");
try (FileSystem fs = FileSystems.newFileSystem(zip, env))
{
// This predicate processed the action because it makes use of BasicFileAttributes
// Rather than process a forEach stream which has to call Files.isDirectory(path)
BiPredicate<Path, BasicFileAttributes> foreach = (p,a) -> {
copy(p,a, fs.getPath("/"+dir.relativize(p)));
return false;
};
Files.find(dir, Integer.MAX_VALUE, foreach).count();
}
System.out.println("ZIPPED "+dir +" to "+zip);
}
private static void copy(Path from, BasicFileAttributes a, Path target)
{
System.out.println("Copy "+(a.isDirectory() ? "DIR " : "FILE")+" => "+target);
try
{
if (a.isDirectory())
Files.createDirectories(target);
else if (a.isRegularFile())
Files.copy(from, target, StandardCopyOption.REPLACE_EXISTING);
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
}https://stackoverflow.com/questions/65357762
复制相似问题