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