I have a code that starts a java process (i.e.: executing a compiled java code) via
ProcessBuilder builder = new ProcessBuilder("java", "Sample", "arg1", "arg2"); builder.redirectErrorStream(true); Process process = builder.start();
Through this, I can basically process the output and errors
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
Now, how can I send input to the stdin
? That is, if the code executed by the process has a line that waits for an input as in:
Scanner scan = new Scanner(System.in); String val = scan.nextLine(); System.out.println(val);
I tried this:
writer.write("I'm from the stdin!."); writer.flush();
Though nothing happened. The console still waited for an input.
Any thoughts?
EDIT: The question was answered, as accepted below. I'm editing to show the faulty code (which I failed to include btw. Lol).
Before the writer.write()
part, I had a
String line; line = reader.readLine(); while (line != null) { System.out.println(line); line = reader.readLine(); }
java.lang.Object java.io.InputStream ch.ethz.ssh2.StreamGobbler public class StreamGobbler extends java.io.InputStream. A StreamGobbler is an InputStream that uses an internal worker thread to constantly consume input from another InputStream. It uses a buffer to store the consumed data.
Methods of InputStream read() - reads one byte of data from the input stream. read(byte[] array) - reads bytes from the stream and stores in the specified array. available() - returns the number of bytes available in the input stream. mark() - marks the position in the input stream up to which data has been read.
InputStream , represents an ordered stream of bytes. In other words, you can read data from a Java InputStream as an ordered sequence of bytes. This is useful when reading data from a file, or received over the network.
The Process
OutputStream
(our point of view) is the STDIN from the process point of view
OutputStream stdin = process.getOutputStream(); // write to this
So what you have should be correct.
My driver (apply your own best practices with try-with-resources statements)
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()); } } }
My application
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()); } } }
Running the driver prints
heello World Sup buddy
For some reason I need the close()
. The flush()
alone won't do it.
Edit It also works if instead of the close()
you provide a \n
.
So with
writer.write("Sup buddy"); writer.write("\n"); writer.write("this is more\n"); writer.flush();
the driver prints
heello World Sup buddy this is more
This is an example which maybe can helps someone
import java.io.IOException; import java.io.File; import java.io.OutputStream; import java.io.InputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { String[] commands = {"C:/windows/system32/cmd.exe"}; ProcessBuilder builder = new ProcessBuilder(commands); builder.directory(new File("C:/windows/system32")); Process process = builder.start(); OutputStream stdin = process.getOutputStream(); InputStream stdout = process.getInputStream(); InputStream stderr = process.getErrorStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); BufferedReader error = new BufferedReader(new InputStreamReader(stderr)); new Thread(() -> { String read; try { while ((read = reader.readLine()) != null) { System.out.println(read); } } catch (IOException e) { e.printStackTrace(); } }).start(); new Thread(() -> { String read; try { while ((read = error.readLine()) != null) { System.out.println(read); } } catch (IOException e) { e.printStackTrace(); } }).start(); new Thread(() -> { while (true) { try { Scanner scanner = new Scanner(System.in); writer.write(scanner.nextLine()); writer.newLine(); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With