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/