The process requires redirected input

I have a standard UNIX executable that requires arguments to be loaded this way

prog.exe <foo.txt.

foo.txt has two lines: the Baz bar

I am using java.lang.ProcessBuilder to execute this command. Unfortunately, prog.exe will only work using file redirection. Is there a way to reproduce this behavior in Java?

Sure,

ProcessBuilder pb = new ProcessBuilder("prog.exe", "bar", "baz"); 

does not work.

Thank!

+7
java processbuilder
Jun 03 2018-10-06T00:
source share
5 answers
 ProcessBuilder pb = new ProcessBuilder("prog.exe"); Process p = pb.start(); OutputStream pos = p.getOutputStream(); InputStream fis = new FileInputStream("file.txt"); byte[] buffer = new byte[1024]; int read = 0; while((read = fis.read(buffer)) != -1) { pos.write(buffer, 0, read); } fis.close(); 

Not tested, but something like this should work.

+8
Jun 03 '10 at 21:41
source share
β€” -

I ended up doing something like this and it works. Thanks for the help!

  import java.io.BufferedWriter; import java.io.BufferedReader; import java.io.IOException; import java.io.OutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.LinkedList; import java.util.List; public class UserInp { public static void main(String[] args) { new UserInp().sample(); } public void sample() { String command = "foo.exe"; List<String> args = new LinkedList<String>(); args.add("bar"); args.add("baz"); ProcessBuilder pb = new ProcessBuilder(command); java.lang.Process process = null; try { process = pb.start(); } catch (IOException ex) { //-- } OutputStream os = process.getOutputStream(); PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(os))); final InputStream is = process.getInputStream(); new Thread(new Runnable() { public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (java.io.IOException e) { } } }).start(); for (String arg : args) { pw.println(arg); } pw.close(); int returnCode = -1; try { returnCode = process.waitFor(); } catch (InterruptedException ex) { //-- } System.out.println(returnCode); } } 
+2
Jun 03 2018-10-06T00:
source share

The redirection is configured by the shell, which needs to be done manually, something like this:

 Process proc = pb.start(); OutputStreamWriter os = new OutputStreamWriter(proc.getOutputStream()); // then write the data from your file to os // ... os.close(); 
+1
Jun 03 '10 at 21:39
source share

Have you tried to wrap prog.exe in a script that takes arguments and processes prog.exe ? I assume you are using a shell, so it’s pretty simple to set up a bash script.

If I understand your problem, the script will look like this:

 #!/usr/bin/bash echo $1 > file echo $2 >> file prog.exe < file remove file 
0
Jun 03 '10 at 21:32
source share

Create a process using ProcessBuilder , then use process.getOutputStream() to get an OutputStream that will connect to the standard inputs of the process.

Open the file using normal Java methods, read the contents of the file and write it to OutputStream to go to the process that you did with ProcessBuilder .

The problem you are currently facing is that you are invoking ProcessBuilder to start

 $ prog.exe foo bar 

Most likely, it is not so close to what you want to achieve.

0
Jun 03 '10 at 21:41
source share



All Articles