[英]How to pass file path as arguments using ProcessBuilder in Java
[英]How to split my arguments up for ProcessBuilder in Java?
我正在嘗試在 Java 中使用 ProcessBuilder,但我不太清楚如何為它拆分我的論點。 例如,此命令 + 參數find . -name 'rc*'
find . -name 'rc*'
。 下面是一些不同的參數拆分,它們都沒有給我正確的結果。 知道我在爭論分裂中做錯了什么嗎?
//This is obvious error since I mixed arugments with the command
processBuilder.command("find . -name 'rc*'").directory(new File("/etc"))
//Gives me exit code 1 and no results
processBuilder.command("find", ". -name 'rc*'").directory(new File("/etc"))
//Gives me also exit code 1 and no results
processBuilder.command("find", ".", "-name", "'rc*'").directory(new File("/etc"))
//Gives me also exit code 1 and no results
processBuilder.command("find", ". -name", "'rc*'").directory(new File("/etc"))
//Gives me also exit code 1 and no results
processBuilder.command("find", ".", "-name 'rc*'").directory(new File("/etc"))
編輯
當我嘗試添加 .inheritIO() 並拆分所有參數時,它部分起作用,因為我得到了權限被拒絕的文件的打印輸出。
processBuilder.command("find", ". -name 'rc*'").directory(new File("/etc")).inheritIO();
但和以前一樣,它沒有列出我的其他“rc”文件。
Listing all rc files in /etc directory:
//Here should be at least dozen files that print out when I use the command in terminal
Exit code: 1
find 'someFileName': Permission denied
find 'someFileName': Permission denied
find 'someFileName': Permission denied
我的過程和打印輸出部分
Process b;
b.processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(b.getInputStream()));
String line = "";
while((line = reader.readLine()) != null){
System.out.println(line);
}
第二次編輯
問題是,如果我將 ProcessBuilder 命令更改為類似的命令(我猜),那么它會使用相同的代碼打印出沒有 prob 的結果文件 - 即我將命令更改為ls -a
類的
processBuilder.command("ls","-a").directory(new File("/etc")).inheritIO();
//and then activate the process and print it just as before and all good ```
啟動來自 Java,因此無需使用單引號轉義查找參數rc*
。 諸如 bash 之類的 shell 會將rc*
擴展為當前目錄中以“rc”為前綴的實際文件(並使用錯誤的搜索值),但 Java 不會這樣做。 此外,每個參數都必須在自己的字符串中:
processBuilder.command("find", ".", "-name", "rc*").directory(new File("/etc"));
或者
processBuilder.command("find", "/etc", "-name", "rc*");
如果 find 報告了很多錯誤,您可能會遇到進程凍結的問題,因為您沒有在讀取 STDOUT 的同時讀取 STDERR。 您可以選擇運行線程來使用流,或重定向 STDERR->STDOUT,或者在調用processBuilder.start()
之前使用Process.redirectOutput(File)
和Process.redirectError(File)
將兩個或合並的流發送到文件。 閱讀這個答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.