Почему я не могу использовать файлы журналов во время выполнения Java

У меня есть (в яве),

rt.exec("qq.exe -i ..(some other parameters) > qq.log");//*1

когда я запускаю qq.exe -i ..(некоторые другие параметры) > qq.log в терминале, он работает нормально и правильно хранит файл qq.log.

Однако использование rt.exec (*1) не работает. Часть " > qq.log" вызывает проблему. Когда я удаляю эту часть, rt.exec (*1) работает, но на этот раз я не могу получить файл qq.log.

В чем причина этой проблемы и есть ли соль??

2 ответа

Решение

rt.exec() не может выполнить код sh/bat. Это просто вызывает другую программу. При попытке перенаправить поток вывода qq.exe с > Символ, который является специфическим для оболочки, Java не понимает, что делать.

Альтернатива - когда вы выполняете какую-то программу с exec метод, получить Process вернулся rt.exec(), Process может дать вам OutputStream для приложения, InputStream из приложения и даже ErrorStream для запущенного приложения.

С InputStream вы можете программно прочитать результат qq.exe, и все, что вам нужно сделать, это записать это в файл.

В Java 7 добавлен класс ProcesBuilder.Redirect, который позволяет перенаправлять потоки ввода / вывода / ошибок в / из файлов. Это можно использовать так:

    ProcessBuilder builder = new ProcessBuilder("cat", "/proc/meminfo");
    // Append all errors from process to log file:
    builder.redirectError(Redirect.appendTo(new File("/tmp/my.log")));
    Process process = builder.start();

Используя соответствующие методы, вы можете перенаправить ввод и вывод. Полный пример здесь: Запустите внешний процесс в Java 7.

Другие вопросы по тегам