gpt4 book ai didi

java - 无法从 Runtime.exec() 获取输出

转载 作者:太空宇宙 更新时间:2023-11-04 14:45:23 25 4
gpt4 key购买 nike

我编写了一段代码,通过 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();

由于正在使用管道符号,因此我无法成功执行命令。根据我的 last question的讨论我已将变量包装在 shell 中:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "grep\">\""+文件名+"| 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 和设置执行上下文目录...

关于java - 无法从 Runtime.exec() 获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24445942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com