1

我一直在尝试用谷歌搜索它很长一段时间,但没有任何成功。我希望在这里解决我的问题。
第一个功能:

public void startTFServer(Channel c) {
    try {
        ProcessBuilder procBuilder = new ProcessBuilder("tfs.exe");
        procBuilder.redirectErrorStream();
        Process proc = null;
        System.out.println(Runtime.getRuntime().freeMemory());
        proc = procBuilder.start();
        System.out.println(Runtime.getRuntime().freeMemory());
        StreamGobbler gobbler = new StreamGobbler(proc.getInputStream(), "STD_OUT");
        gobbler.start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

捕获进程输出的线程:

private class StreamGobbler extends Thread {
    InputStream is;
    String type;

    private StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }

    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {               
                System.out.println(type + "> " + line);
            }
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

问题: 运行应用程序时,输入中断每次都在同一个地方。我使用“进程类”运行的应用程序是一个需要相当多内存才能运行的服务器,这可能是进程无法完成加载我的应用程序的原因之一吗?我以为内存会耗尽,但我无法真正诊断它。

任何帮助将不胜感激!

4

2 回答 2

2

我注意到一个问题:

procBuilder.redirectErrorStream();

这不是你想要的。这是一个 getter 方法,它告诉您 redirectErrorStream 属性的值是什么。可能是您有错误并且由于未读取它们而被阻止。因此,需要使用setter方法:见API redirectErrorStream(boolean)

procBuilder.redirectErrorStream(true);
于 2013-06-04T00:57:42.823 回答
1

如果我错了,我猜很抱歉,但我认为你正在耗尽外部进程的输出,而不是等到它完成才能继续阅读。我的意思是,基本上:

while ((line = br.readLine()) != null) {               
    System.out.println(type + "> " + line);
}

如果进程停止写入输出一秒钟,您的记录器将停止记录。如果它再次开始写入,您将脱离循环。

于 2013-06-04T00:29:35.580 回答