Escribir en InputStream de un proceso Java

Tengo un código que inicia un proceso de Java (es decir, la ejecución de un código Java comstackdo) a través de

ProcessBuilder builder = new ProcessBuilder("java", "Sample", "arg1", "arg2"); builder.redirectErrorStream(true); Process process = builder.start(); 

A través de esto, básicamente puedo procesar la salida y los errores

 OutputStream stdin = process.getOutputStream(); // <- Eh? InputStream stdout = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); // reader.readLine() blah blah 

Ahora, ¿cómo puedo enviar datos al stdin ? Es decir, si el código ejecutado por el proceso tiene una línea que espera una entrada como en:

 Scanner scan = new Scanner(System.in); String val = scan.nextLine(); System.out.println(val); 

Intenté esto:

 writer.write("I'm from the stdin!."); writer.flush(); 

Aunque no pasó nada. La consola aún esperaba una entrada.

¿Alguna idea?

EDIT: la pregunta fue respondida, como se acepta a continuación. Estoy editando para mostrar el código defectuoso (que no pude incluir por cierto. Lol).

Antes de la parte writer.write() , tuve una

 String line; line = reader.readLine(); while (line != null) { System.out.println(line); line = reader.readLine(); } 

El Process OuputStream (nuestro punto de vista) es el STDIN desde el punto de vista del proceso

 OutputStream stdin = process.getOutputStream(); // write to this 

Entonces, lo que tienes debe ser correcto.

Mi controlador (aplique sus propias mejores prácticas con declaraciones try-with-resources)

 public class ProcessWriter { public static void main(String[] args) throws Exception { ProcessBuilder builder = new ProcessBuilder("java", "Test"); builder.directory(new File("C:\\Users\\sotirios.delimanolis\\Downloads")); Process process = builder.start(); OutputStream stdin = process.getOutputStream(); // <- Eh? InputStream stdout = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); writer.write("Sup buddy"); writer.flush(); writer.close(); Scanner scanner = new Scanner(stdout); while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } } } 

Mi aplicación

 public class Test { public static void main(String[] args) throws Exception { Scanner console = new Scanner(System.in); System.out.println("heello World"); while(console.hasNextLine()) { System.out.println(console.nextLine()); } } } 

Ejecutando el controlador imprime

 heello World Sup buddy 

Por alguna razón, necesito el close() . El flush() solo no lo hará.

Editar También funciona si en lugar de close() proporciona \n .

Entonces con

 writer.write("Sup buddy"); writer.write("\n"); writer.write("this is more\n"); writer.flush(); 

el conductor imprime

 heello World Sup buddy this is more