Вызовите 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();

Код стал правильно работать