Java执行程序是否可以用力冲洗?

时间:2018-07-22 19:05:55

标签: java windows output exec

我是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) 而且我及时得到了输出。

1 个答案:

答案 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