Search code examples
javaprocessbuilder

Java: Can't execute external exe with arguments


I’m trying to run an external program with arguments. The program can take different types of arguments, for instance avl tip.avl or avl < test.ops

I can get avl tip.avl running through

try {
    String[] list = {"avl", "test_0.avl"};
    ProcessBuilder pb = new ProcessBuilder(list);
    pb.command(list);
    final Process p = pb.start();
    BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream() ) );
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception ex) {
    System.out.println(ex);
}

but when I try

String[] list = {"avl", "<", "test_0.ops"};
ProcessBuilder pb = new ProcessBuilder(list);
pb.command(list);
final Process p = pb.start();

the "<" does not get sent as an argument, but as an input after the program runs. avl < test.ops works ok when I try it from command line, but cant get it to work through ProcessBuilder.

I think avl tip.avl works because running avl tip.avl is the same as just running avl and then typing tip.avl. Which is what ProcessBuilder seems to be doing actually ...

I assumed the arguments would be passed all at one. What would be the right way of doing what the command prompt input does avl < test.ops + ENTER


Solution

  • You cannot redirect input like that from Java. Using < is a special shell pipe redirection command.

    You will either have to use processBuilder.getOutputStream() to write data to the process, or else you can use redirectInput.