无论如何p.getInputStream()是否为“live”?

时间:2012-02-01 20:51:55

标签: java process

好的,我正在尝试做的是为另一个应用程序制作一个java GUI包装器。我遇到的问题是我在输出“实时”方面遇到了问题。此时,应用程序在正在运行的进程结束时吐出所有应用程序输出。由于正在运行的应用程序是用于游戏Minecraft的地图渲染器工具,因此输出基本上是当前作业的进度指示器,因此它需要有效。我目前使用的代码是:

package net.rymate.overviewer;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

/**
*
* @author ryan
*/
public class Testmain {

    public Testmain(String commandline) {
        try {
            String line;
            Process p = new ProcessBuilder(commandline, "C:/exmaple/ C:/output").start();
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            while ((line = err.readLine()) != null) {
                System.out.println(line);
            }
            input.close();
        } catch (Exception err) {
            err.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //new Testmain("C:/Documents and Settings/ryan/My Documents/overviewer-0.4.22-win32/overviewer.exe -v");
        new Testmain("C:/Documents and Settings/ryan/My Documents/overviewer-0.4.22-win32/overviewer.exe");
    }
}

任何帮助将不胜感激。 :)

编辑:似乎应用程序似乎只能输出任何错误,如果它不通过cmd运行。那么通过该实现有没有办法通过cmd运行它?

1 个答案:

答案 0 :(得分:0)

减少BufferedReader大小是一个简单但不正确的修复,如果错误流(你读到的第二个)在你阅读它之前会产生大量输出,它将会挂起。执行此操作的正确方法是为每个流创建一个线程,以便在数据可用时立即读取数据。这取决于你如何处理stdout和stderr的同步输出。