好的,我正在尝试做的是为另一个应用程序制作一个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运行它?答案 0 :(得分:0)
减少BufferedReader大小是一个简单但不正确的修复,如果错误流(你读到的第二个)在你阅读它之前会产生大量输出,它将会挂起。执行此操作的正确方法是为每个流创建一个线程,以便在数据可用时立即读取数据。这取决于你如何处理stdout和stderr的同步输出。