почему я не могу использовать файлы журналов во время выполнения Java - PullRequest
3 голосов
/ 22 августа 2010

У меня (в 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 ]

3 голосов
/ 22 августа 2010

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

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

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

0 голосов
/ 24 марта 2016

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 .

...