我是Java的新手,所以我的问题可能会混乱。
我试图从Java运行某些进程。它是xmr-stack
矿工。我使用这样的代码:
package com.company;
import java.io.*;
public class Main {
public static void main(String[] argv) throws Exception {
try {
String line;
Process p = Runtime.getRuntime().exec( "D:\\xmr-stak.exe " +
/* some arguments */ );
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()) );
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
}
catch (Exception e) {
// ...
}
}
}
它对普通事物很完美。
但是我遇到一个问题,在xmr-stak
中的某个点之后,我没有输出。据我了解,此应用程序有时会创建子进程。而且我没有看到此子进程产生的输出。
但是经过很长时间的工作(超过10分钟)之后,我一直都得到了输出。 看起来有些输出缓冲区在溢出后被刷新了。 现在,我想了解如何在Java中更频繁地获取所需的输出。
从另一面来看,我用c ++编写了相同的逻辑 (基于此问题SO arswer) 而且我及时得到了输出。
答案 0 :(得分:0)
Runtime.exec已过时。您可以用几行使用ProcessBuilder的行替换整个程序:
ProcessBuilder builder = new ProcessBuilder("D:\\xml-stak.exe",
arg1, arg2, arg3);
builder.inheritIO();
Process p = builder.start();
p.waitFor();
您不需要读取进程的输出(因此不必担心缓冲),因为InheritIO()使该输出出现在Java程序的输出中。
您也不需要捕获任何异常,因为您的main
方法已经具有throws Exception
。