Вызовите exe из Java с передачей параметров с записью в stdout и чтением из stdin
Я прочитал этот вопрос:
Программирование на Java: вызов exe из Java и передача параметров
И этот ответ достаточно хорош
qaru.site/info/22662/...
Но я также хочу передать параметры на stdin внешнего процесса и прочитать из этого процесса.
Как я могу это сделать?
Мои усилия:
Основной метод:
public class ProcessBuilderTest {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("C:\\Program Files\\Java\\jdk1.8.0_111\\bin\\java",
"-cp", //class path key
"C:\\Users\\redwhite\\IdeaProjects\\HelloMyWorld\\out\\production\\HelloMyWorld" , // path to class file of ExternalProcess class
"call_external.ExternalProcess"); // fully qualified name
Process process = pb.start();
OutputStream processOutputStream = process.getOutputStream();
IOUtils.write("1" + System.lineSeparator(), processOutputStream);
InputStream processInputStream = process.getInputStream();
System.out.println("--1--");
System.out.println(process.isAlive()); // outputs true
String result = IOUtils.toString(processInputStream, "UTF-8"); //<-- hangs here
System.out.println("--2--");
process.waitFor();
System.out.println(result); // expect to see processed[1]
}
}
ExternalProcess ждет строку из stdin и создаст другую строку в stdout:
package call_external;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by redwhite on 27.03.2017.
*/
public class ExternalProcess {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
System.out.println("processed[" + input + "]");
}
}
Этот код виснет. Я не могу понять, почему
Ответы
Ответ 1
Я не знаю, что такое класс IOUtils
и что делает метод toString()
. Однако способ чтения из InputStream
:
InputStreamReader isr;
BufferedReader br;
String input = "";
String line;
try {
isr = new InputStreamReader( p.getInputStream );
br = new BufferedReader( isr );
while( (line = br.readLine()) != null ) {
input += line + "\n";
}
} catch( Exception e ) {
e.printStackTrace();
}
Ответ 2
Если я хорошо понял вашу проблему, вы ищете функцию, эквивалентную плюсам в Java. Возможно, это обсуждение может вам помочь:)
Java: функция popen() - как?
Ответ 3
Вместо добавления \n
в конце строки поток должен быть закрыт
таким образом, после замены
IOUtils.write("1" + System.lineSeparator(), processOutputStream);
с
IOUtils.write("1", processOutputStream);
processOutputStream.close();
Код стал правильно работать