2010-06-03 11 views
7

Tengo un ejecutable nativo UNIX que requiere los argumentos para ser alimentados en como esteproceso requiere redirigido entrada

PROG.EXE < foo.txt.

foo.txt tiene dos líneas: barra Baz

estoy usando java.lang.ProcessBuilder para ejecutar este comando. Lamentablemente, prog.exe solo funcionará utilizando la redirección de un archivo. ¿Hay alguna forma en que pueda imitar este comportamiento en Java?

Por supuesto,

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

no funciona.

Gracias!

Respuesta

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

No probado, pero algo así debería funcionar.

+0

En mi caso (JDK 6), tuve que usar el constructor InputStream que toma un archivo. La cuerda con el camino no funcionó para mí. Gracias Marc. E.g .: InputStream fis = new FileInputStream (nuevo archivo ("/ Path/to/file.txt")); – tremendows

0

¿Trataste de envolver prog.exe en un script que acepta argumentos y trata con prog.exe? Supongo que está usando un shell, por lo que es bastante sencillo configurar un script bash.

Si entiendo su problema, el guión se vería así:

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

Eso estaría bien, pero el objetivo de esto es realizar un puerto de UNIX a Windows. Entonces no tendré un caparazón en la nueva plataforma. – initialZero

1

La redirección está configurado por la caja hay que TODO esto manualmente, algo así:

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

Cree el proceso usando ProcessBuilder, luego use process.getOutputStream() para obtener un OutputStream que se conectará a la entrada estándar del proceso.

Abra el archivo utilizando las técnicas normales de Java, lea el contenido del archivo y escríbalo en el OutputStream yendo al Proceso que realizó con el ProcessBuilder.

El problema que tenemos ahora es que se está llamando a la ProcessBuilder para lanzar

$ prog.exe foo bar 

Cuál es, probablemente, nada cerca de lo que quiere lograr.

2

Terminé haciendo algo como esto y funciona. ¡Gracias por toda la ayuda!

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); 
     } 
    } 
Cuestiones relacionadas