Почему я не могу использовать файлы журналов во время выполнения 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.