Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing to InputStream of a Java Process

Tags:

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(); } 
like image 873
Gx.Zero Avatar asked Sep 19 '13 19:09

Gx.Zero


People also ask

What is StreamGobbler Java?

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.

How does InputStream work in Java?

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.

What does InputStream mean?

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.


2 Answers

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 
like image 165
Sotirios Delimanolis Avatar answered Sep 26 '22 17:09

Sotirios Delimanolis


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();     } } 
like image 43
Hussein Shoqanebi Avatar answered Sep 26 '22 17:09

Hussein Shoqanebi