Reputation: 9437
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
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
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