Julio Diaz
Julio Diaz

Reputation: 9437

Executing external program in Java

I am trying to run "cut" inside a java program, but I am lost in terms of how to split the array of commands. My program in the command line is the following:

cut file.txt -d' ' -f1-2  > hits.txt

And I am trying to run it inside java like this

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(new String[]{"file.txt"," -d' ' -f1-2 "," > hits.txt"});
pr.waitFor();

But I get the following runtime error

Exception in thread "main" java.io.IOException: Cannot run program "cut file.txt": java.io.IOException: error=2, No such file or directory

I attribute this error to the array of Strings I am using as exec commands. Any ideas on how to do this? Also any known documentation on the issue. Thanks

Upvotes: 1

Views: 1148

Answers (2)

user unknown
user unknown

Reputation: 36259

Make either an script for bash:

"/bin/bash" "-c" "cut file.txt -d' ' -f1-2  > hits.txt"

or split

"cut" "file.txt" "-d" "' '" "-f" "1-2" 

The error message clearly says:

Cannot run program "cut file.txt"

so it interprets "cut file.txt" as a single programname with a blank inside.

Your problem starts with the redirection, because you can't redirect the output that way:

"cut" "file.txt" "-d" "' '" "-f" "1-2" ">" "hits.txt"

You have to handle input and output streams. It might be a better idea to implement cut in Java, to get a portable solution, or call a script which the user may specify on commandline or in a config file, so that it can be adapted for Windows or other platforms.

Calling /bin/bash and redirecting there should work - on unix like systems.

Upvotes: 1

Adam Norberg
Adam Norberg

Reputation: 3076

If you want output redirection, you have to do it yourself. > hits.txt will not do what you want. Redirecting stdout from a process called by exec is covered in another StackOverflow question.

The error you're showing isn't consistent with the source code you've listed here- there's no source for cut, for one thing. It's definitely trying to understand cut file.txt to be the complete relative path to a single executable with a space in its name, which is almost certainly not what you want. It would be easier to troubleshoot this with correct code.

Upvotes: 1

Related Questions