[英]Can't get output from Runtime.exec()
我已經編寫了一個代碼來通過Java在Shell上執行命令:
String filename="/home/abhijeet/sample.txt";
Process contigcount_p;
String command_to_count="grep \">\" "+filename+" | wc -l";
System.out.println("command for counting contigs "+command_to_count);
contigcount_p=Runtime.getRuntime().exec(command_to_count);
contigcount_p.wait();
由於使用了管道符號,所以我無法成功執行命令。根據我最后一個問題的討論,我將變量包裝在shell中:
Runtime.getRuntime().exec(new String[]{"sh", "-c", "grep \\">\\" "+filename+" | wc -l"});
它對我有用,因為它確實在shell上執行命令,但是仍然在我嘗試使用緩沖閱讀器讀取其輸出時:
BufferedReader reader =
new BufferedReader(new InputStreamReader(contigcount_p.getInputStream()));
String line=" ";
while((line=reader.readLine())!=null)
{
output.append(line+"\n");
}
它返回一個空值,正如我在上一個問題上討論的那樣,我找到了一個臨時解決方案: link ,但是我想通過使用BufferedReader讀取輸出來使用正確的方法。
當我使用{"sh", "-c", "grep \\">\\" "+filename+" | wc -l"}
的命令行時,它會繼續覆蓋我的文件
我必須更改它,以便雙引號引起來, {"sh", "-c", "grep \\"\\">\\"\\" "+filename+" | wc -l"}
因此,使用它作為我的測試文件的內容...
>
>
>
Not a new line >
並使用此代碼...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestProcess {
public static void main(String[] args) {
String filename = "test.tx";
String test = "grep \"\">\"\" "+filename+" | wc -l";
System.out.println(test);
try {
ProcessBuilder pb = new ProcessBuilder("sh", "-c", test);
pb.redirectError();
Process p = pb.start();
new Thread(new Consumer(p.getInputStream())).start();
int ec = p.waitFor();
System.out.println("ec: " + ec);
} catch (IOException | InterruptedException exp) {
exp.printStackTrace();
}
}
public static class Consumer implements Runnable {
private InputStream is;
public Consumer(InputStream is) {
this.is = is;
}
@Override
public void run() {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))){
String value = null;
while ((value = reader.readLine()) != null) {
System.out.println(value);
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}
我能夠產生這個輸出...
grep "">"" test.tx | wc -l
4
ec: 0
通常,在處理外部流程時,使用ProcessBuilder
通常更容易,它具有一些不錯的選項,包括重定向錯誤/ stdout和設置執行上下文目錄...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.