Scrittura su InputStream di un processo Java

Ho un codice che avvia un processo java (es: eseguendo un codice java compilato) tramite

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

Attraverso questo, posso fondamentalmente elaborare l’output e gli errori

 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 

Ora, come posso inviare input allo stdin ? Cioè, se il codice eseguito dal processo ha una linea che aspetta un input come in:

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

Ho provato questo:

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

Anche se non è successo nulla. La console aspettava ancora un input.

qualche idea?

EDIT: risposta alla domanda, come accettata di seguito. Sto modificando per mostrare il codice difettoso (che non sono riuscito a includere btw. Lol).

Prima della parte writer.write() , ho avuto un

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

Il Process OuputStream (il nostro punto di vista) è lo STDIN dal punto di vista del processo

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

Quindi quello che hai dovrebbe essere corretto.

Il mio driver (applica le tue best practice con le dichiarazioni 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()); } } } 

La mia applicazione

 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()); } } } 

Esecuzione delle stampe del driver

 heello World Sup buddy 

Per qualche ragione ho bisogno della close() . Il flush() da solo non lo farà.

Modifica Funziona anche se al posto di close() tu fornisci un \n .

Quindi con

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

l'autista stampa

 heello World Sup buddy this is more