You are on page 1of 3

How to execute native shell commands from Java Program

How to execute native shell commands from JAVA


Though its not recommended but some time its become necessary to execute native operating system or shell
command from JAVA, especially if you are doing some kind of reporting or monitoring stuff and required information
can easily be found using native command. This is not advised though because then you will lose platform
independence which is why we mostly used JAVA.

Anyway if you no choice and you want to execute native commands from JAVA then its good to know that how we can
do it, many of you probably know this but for those who don't know and have never done it we will see through an
example.

Suppose you want to execute "ls" command in Linux which list down all the files and directory in a folder and you want
to do it using JAVA.

In JAVA we have a class called "java.lang.Runtime" which is used to interact with Runtime system has facility to
execute any shell command using method exec().

Here is the code sample which can be used to execute any native command from JAVA.

final String cmd = "ls -lrt";

int pid = -1;

try {
// Run ls command
Process process = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
e.printStackTrace(System.err);
}

This is little nice tip which can be very handy in some specific situation but in by and large its not advised by the very
own reason of making JAVA code platform dependence.

as pointed out by Jaroslav sedlacek If not done properly it can easily hang the application. Java and external
process communicate through buffers. If buffer fills up, the external process stops and waits until java empties
the buffer. Java app has to read both output and error streams of the process to prevent this blocking. There
is good util class ProcessBuilder since 1.5 in java or apache commons exec can be used too.

10 Example of find command in Unix and Linux


Inter Thread Communication in Java using Wait Notify Example
How to remove duplicates elements from ArrayList in Java
Why multiple inheritances are not supported in Java
Posted by Javin Paul

Labels: core java


Location: United States

6 comments :

Jaroslav Sedlacek said...


I agree that executing external processes from Java should be used only
exceptionally. It does not only create platform dependency but it is a
potential minefield. If not done properly it can easily hang the application.
Java and external process communicate through buffers. If buffer fills up,
the external process stops and waits until java empties the buffer. Java app
has to read both output and error streams of the process to prevent this
blocking.
There is good util class ProcessBuilder since 1.5 in java or apache commons
exec can be used too.
February 23, 2011 at 3:55 AM
Javin @ FIX Protocol Tutorials said...
Thank you very much Jaroslav for your valuable comments and highlight the
fact that Java and external process communicate through buffers and
programmer needs to clear both output and error streams to prevent
blocking.
Once again thank your for adding value into blog.
Javin
February 24, 2011 at 7:29 PM
$enorCarbone said...
Android developers can make great use of this for running native code on
Android devices.Beware though, the executable can only be executed from
the application locally permitted application directory : /data/data/apppackage-here . cheers :)
February 25, 2011 at 4:56 AM
Anonymous said...
I tried this example but no result ,
can someone help me please ,t want to execute a shell command in java
August 13, 2011 at 4:43 PM
Javin @ String vs Stringbuffer said...
Hi Anonymous, Can you put more details why you are not able to execute
any command from shell ? are you trying in windows or unix ? by the way
this is the standard way of executing any shell command from java program.
Please provide more details about your issue and we can help you better.
August 13, 2011 at 6:17 PM
Broken Smile said...

I want to push arguments in the java File How can I do that.


Suppose, My routine is,
protected void executeCommand (String cmd) {
if (cmd == null) return ;
try {
System.out.println (cmd) ;
Process process = Runtime.getRuntime().exec (cmd);
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
And I want to run this,
java -Djava.library.path=. ArbitSocketGUI 1 2 3
as cmd in the routine.
And I want to access 1 2 3 in the ArbitSocketGUI Class. But I am unable to do
that. Help me. How can I do that.
January 12, 2012 at 11:57 PM

Read more: http://javarevisited.blogspot.com/2011/02/how-to-execute-native-shellcommands.html#ixzz4SqIgO5dN