Как я могу получить консольный вывод, сгенерированный exe-файлом? - PullRequest
3 голосов
/ 09 августа 2009

без использования перенаправления в файл (">", ">>")

Ответы [ 3 ]

10 голосов
/ 09 августа 2009
Process p = Runtime.getRuntime().exec("executable.exec");

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line;
while ((line = input.readLine()) != null) {
  System.out.println(line);
}
0 голосов
/ 09 августа 2009

Обратите внимание, что вы должны использовать stdout и stderr одновременно, чтобы предотвратить блокировку.См. этот ответ для получения более подробной информации.

Обратите внимание, что вам, возможно, удастся просто взять стандартный вывод, а не стандартный вывод.Однако, если ваш .exe генерирует ошибку в некотором сценарии, тогда ваш родительский процесс может заблокировать дополнительные (неожиданные) данные потока.Поэтому всегда лучше запускать сбор потоков одновременно.

0 голосов
/ 09 августа 2009

Если вы используете тип командной строки из plexus-utils , вы можете избежать большой нагрузки, связанной с взаимодействием командной строки, например, ожидания процесса, экранирования аргументов и т. Д. Вы можете установить команду а также при необходимости.

Вы можете передать StreamConsumers для захвата stdout и stderr, обработка командной строки будет передавать выходные данные потребителям по одной строке за раз.

Commandline cl = new Commandline();

cl.setExecutable( "dir" );

cl.setWorkingDirectory( workingDirectory.getAbsolutePath() );

cl.createArg().setValue( "/S" );

StreamConsumer consumer = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

StreamConsumer stderr = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

int exitCode;

try {
    exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() );
} catch ( CommandLineException ex ) {
    //handle exception
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...