java - Processbuilder 抛出 IO 异常

标签 java process

    File information = new File(args[0],"temp.txt");
    information.createNewFile(); //shortcut for Stackoverflow
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.redirectOutput(information); //does not work on standard output eiher
    processBuilder.command("find " + args[0] + " -atime +" + args[1]);
    processBuilder.start();

抛出:

java.io.IOException: Cannot run program "find /users/niclas -atime +365": error=2, No such file or directory
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at com.company.Main.find(Main.java:35)
    at com.company.Main.main(Main.java:14)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:319)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:250)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
    ... 3 more

在命令行上,相同的字符串工作得很好: find /users/niclas -atime +365 造成这种情况的原因是什么?

最佳答案

当您在 command(String...) 方法重载中将命令传递给 ProcessBuilder 时,您应该为每个命令的参数传递一个单独的字符串.

否则它认为命令的名称是第一个字符串 - 包括空格等 - 它不会进行解析。 ProcessBuilder 不是 shell,无法进行复杂的解析。

使用

processBuilder.command("find", args[0],"-atime",args[1]);

您不需要使用空格,如果您的参数包含空格,则空格将作为参数的一部分传递,无需更改。

请注意,您可能需要使用完整路径,例如/usr/bin/find 而不仅仅是 find

关于java - Processbuilder 抛出 IO 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59551327/

相关文章:

java - 如何使用带有 OAuth2 身份验证的 Gmail SMTP 使用 java 邮件发送邮件?

php - PHP/Python 中的死人开关

linux - 更正 "nice"批处理程序的 POSIX 调度优先级

java - 使用重定向输入开始类(class)

Android ActivityManager killBackgroundProcess 不工作

python - 在 Python 中从进程 ID 获取父进程和子进程 ID

java - 设置类路径仍然找不到外部 Jar

java - 如何从我的应用程序向 android studio 中的用户发送电子邮件?

java - 当子项目之间存在冲突时,为什么 maven 使用旧版本?

java - 运行时/已检查/未检查/错误/异常之间的差异