Попытка выполнить банку Java с помощью Runtime.getRuntime().exec()

В проекте, над которым я работаю, мне нужно выполнить сценарий, который у меня есть в папке ресурсов — в пути к классу. Я просто тестирую окончательную функциональность сценария, поскольку я работаю в Windows, мне нужен был способ вывода файла в STDIN, поэтому я создал простую программу cat.jar для клонирования команды unixs cat.

Поэтому, когда я делаю «java -jar cat.jar someFile.txt», он выводит файл на стандартный вывод. Я уверен, что есть разные способы сделать то, что я сделал.

В любом случае, я хочу запустить этот JAR из моей основной Java-программы. я делаю

Runtime.getRuntime().exec("java -jar C:/cat.jar C:/test.txt");

Я пытался переключить косую черту на обратную косую черту и экранировать ее - не сработало. На стандартный выход ничего не отправляется.

Где, если я запускаю кошачью банку самостоятельно, я получаю файл, направленный на стандартный вывод.

Что я здесь делаю неправильно? Это достаточно информации?


person Envin    schedule 30.04.2013    source источник
comment
1) Прочтите информацию runtime.exec. страница. Внедрите все рекомендации в связанной статье Java World. 2) Затем игнорируйте его, ссылаясь на exec, и используйте конструктор ProcessBuilder(String[]). 3) Выполнение первых двух шагов, вероятно, даст вам достаточно информации для решения проблемы, в противном случае мы предоставим больше информации, чтобы мы могли помочь.   -  person Andrew Thompson    schedule 30.04.2013
comment
Да, я прочитал всю информацию, если она была очень полезной :)   -  person Envin    schedule 01.05.2013


Ответы (1)


Используйте экземпляр Process, возвращенный exec()

Process cat = Runtime.getRuntime().exec("java -jar C:/cat.jar C:/test.txt");
BufferedInputStream catOutput= new BufferedInputStream(cat.getInputStream());
int read = 0;
byte[] output = new byte[1024];
while ((read = catOutput.read(output)) != -1) {
    System.out.println(output[read]);
}


Ссылки:
http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

По умолчанию созданный подпроцесс не имеет собственного терминала или консоли. Все его стандартные операции ввода-вывода (stdin, stdout, stderr) будут перенаправлены родительскому процессу, где к ним можно будет получить доступ через потоки, полученные с помощью методов getOutputStream(), getInputStream() и getErrorStream().

http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getInputStream()

getInputStream() возвращает входной поток, подключенный к обычному выходу подпроцесса.

person Ravi K Thapliyal    schedule 30.04.2013
comment
@Ravi Thapliyal супер ответ и спасибо. я искал этот тип f ответ. еще раз спасибо - person ; 22.05.2013