2010-06-03 11 views
7

Ho un eseguibile nativo UNIX che richiede gli argomenti da alimentare in similiprocesso richiede reindirizzato ingresso

PROG.EXE < foo.txt.

foo.txt ha due linee: bar baz

Sto usando java.lang.ProcessBuilder per eseguire questo comando. Sfortunatamente, prog.exe funzionerà solo usando il reindirizzamento da un file. C'è un modo in cui posso simulare questo comportamento in Java?

Naturalmente,

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

non funziona.

Grazie!

risposta

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

Non testato, ma qualcosa del genere dovrebbe funzionare.

+0

Nel mio caso (JDK 6), ho dovuto utilizzare il costruttore InputStream che accetta un file. La stringa con il percorso non ha funzionato per me. Grazie Marc. E.g .: InputStream fis = new FileInputStream (nuovo file ("/ Path/to/file.txt")); – tremendows

0

Hai provato a inserire prog.exe in uno script che accetta argomenti e gestisce prog.exe? Presumo che tu stia utilizzando una shell, quindi è abbastanza semplice impostare uno script bash.

Se ho ben capito il problema, lo script sarà simile:

#!/usr/bin/bash 
echo $1 > file 
echo $2 >> file 
prog.exe < file 
remove file 
+0

Ciò andrebbe bene ma il punto di questo è il port da UNIX a Windows. Quindi non avrò una shell sulla nuova piattaforma. – initialZero

1

Il reindirizzamento è messa a punto dalla shell è necessario todo manualmente, qualcosa di simile:

Process proc = pb.start(); 
OutputStreamWriter os = new OutputStreamWriter(proc.getOutputStream()); 
// then write the data from your file to os 
// ... 
os.close(); 
0

Creare il processo utilizzando un ProcessBuilder, quindi utilizzare process.getOutputStream() per ottenere un OutputStream che verrà reindirizzato all'input standard del processo.

Aprire il file utilizzando le normali tecniche Java, leggere il contenuto del file e scriverlo su OutputStream andando al processo eseguito con lo ProcessBuilder.

Il problema si ha in questo momento è che si sta chiamando il ProcessBuilder per lanciare

$ prog.exe foo bar 

che è probabilmente nulla vicino a quello che si vuole raggiungere.

2

Ho finito per fare qualcosa di simile e funziona. Grazie per tutto l'aiuto!

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); 
     } 
    } 
Problemi correlati