首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ProcessBuilder的问题

使用ProcessBuilder的问题
EN

Stack Overflow用户
提问于 2020-12-18 13:18:32
回答 1查看 86关注 0票数 0

我和ProcessBuilder.start();有一些问题。

下面是代码的一个示例:

代码语言:javascript
运行
复制
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

下面是堆栈跟踪:

代码语言:javascript
运行
复制
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();上崩溃,我无法想象输入有多重要,然而,这就是为什么我要伸出援手的原因,所以可能是这样的。

如果需要澄清,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-18 15:17:25

错误消息说,Java在当前目录或路径中找不到一个名为zip的可执行文件,如下所示:

代码语言:javascript
运行
复制
String systemPath = System.getenv("PATH");
System.out.println("PATH="+systemPath);

将启动程序修复为包含"zip“的完整路径,或修复用于Java的路径,以包含包含zip的目录。

代码语言:javascript
运行
复制
myListOfString.add("/the/path/to/zip");

或者类似的东西(取决于你的外壳/终端)

代码语言:javascript
运行
复制
export PATH=/the/path/to:$PATH

正如@Abra所建议的,在Java内部有更好的方法可以不依赖ProcessBuilder,例如:

代码语言:javascript
运行
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65357762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档