В любом случае p.getInputStream () должен быть «живым»? - PullRequest
0 голосов
/ 02 февраля 2012

Хорошо, я пытаюсь создать оболочку графического интерфейса пользователя Java для другого приложения.У меня проблема в том, что у меня проблемы с выходом "вживую".В этот момент приложение выплевывает весь вывод приложения в конце выполняемого процесса.Поскольку запущенное приложение представляет собой инструмент рендеринга карт для игры 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 голосов
/ 02 февраля 2012

Уменьшение размера BufferedReader - это простое, но неправильное исправление, которое будет зависать, если поток ошибок (который вы прочитали секунду) выдает много выходных данных, прежде чем вы приступите к чтению. Правильный способ сделать это - создать один поток для каждого потока, который считывает данные, как только они становятся доступными. Вам решать, как вы хотите обрабатывать одновременный вывод как из stdout, так и из stderr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...