Solved

calling system commands within Java

Posted on 2011-03-16
21
333 Views
Last Modified: 2012-06-22
Hi,
Can we directly call a system command within java code?

Here is an example:

grep '^(SdD)' args[2]; 

Open in new window


args[2] is the path to a text file.

Thanks,

0
Comment
Question by:Tolgar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 10
  • 7
  • 4
21 Comments
 
LVL 47

Expert Comment

by:for_yan
ID: 35151445
Yes we can - you should use

Runtime.getRuntime().exec("command arguments");
0
 
LVL 47

Expert Comment

by:for_yan
ID: 35151470
0
 
LVL 47

Expert Comment

by:for_yan
ID: 35151480

And this is how you read the ouput from the second example (importnat part of the process):
http://www.exampledepot.com/egs/java.lang/ReadFromCommand.html
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 86

Expert Comment

by:CEHJ
ID: 35151504
You'd be better off calling a shell script. But see my comments here http:Q__26889988.html
Process p = Runtime.getRuntime().exec(new String[] { "sh mygrep.sh", args[2] });

Open in new window

0
 

Author Comment

by:Tolgar
ID: 35151736
So as a result is this correct?

java.lang.String myFiles = Runtime.getRuntime().exec(grep '^(SdD)' args[3]);

Open in new window



Thanks,
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35151787
Sorry that should have been
Process p = Runtime.getRuntime().exec(new String[] { "sh", "mygrep.sh", args[2] });

Open in new window

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35151813
With a shell script consisting of

grep '^(SdD)' "${@}"

I've just tested the following code and it works fine.

You can grep in files in pure Java too
public class GrepTest {
    public static void main(String[] args) throws Exception {
	Process p = Runtime.getRuntime().exec(new String[] { "sh",  "mygrep.sh", args[2] });

	StringBuilder stderr = new StringBuilder();
	StringBuilder stdout = new StringBuilder();
	net.proteanit.io.IOUtils.collectProcessStreams(p, stderr, stdout);
	System.out.println(stdout);
    }
}

Open in new window

0
 

Author Comment

by:Tolgar
ID: 35151893
So is this gonna work?

java.lang.String myFiles = Runtime.getRuntime().exec(grep '^(SdD)' args[3]);

Open in new window



Thanks,
0
 
LVL 47

Expert Comment

by:for_yan
ID: 35152037
No, one thing
you need to havwe arguments in quotes:

Process p = Runtime.getRuntime().exec("grep '^(SdD)'  " + args[3]);
and then you need to collect the output as CEHJ showed:

      StringBuilder stderr = new StringBuilder();
      StringBuilder stdout = new StringBuilder();
      net.proteanit.io.IOUtils.collectProcessStreams(p, stderr, stdout);
      System.out.println(stdout);

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35152045
Let's take a closer look there: i don't know what version of grep you're using, but the effect of that command with the greps i know would effectively either return args[3] or nothing. What is your intention there?
0
 

Author Comment

by:Tolgar
ID: 35152134
So args[3] is a path to a file. What I would like to do is:

grep the lines in this file that starts with s or d or D.

Thanks,
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35152151
That would be
grep '^[sdD]' foo

Open in new window

0
 
LVL 47

Expert Comment

by:for_yan
ID: 35152176
Maybe it is still easier to do it in Java, rather than going to the system ?
0
 

Author Comment

by:Tolgar
ID: 35152251
You may be right. So how can I make it in Java only without going to the system?

Thanks,
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35152263
Just read into a List and add if

s.matches("^[sDd].*");
0
 
LVL 47

Expert Comment

by:for_yan
ID: 35152272


DataInputStream in = new DataInputStream(new FileInputStream(args[3]))
String buff = null;
while((buff=in.readLine() )!= null){
buff = in.readLine();
if(buff.startsWith("s") || buff.startsWith("S") || buff.startsWith("D")){
System.out.println(buff);
}
in.close();
}
0
 
LVL 47

Accepted Solution

by:
for_yan earned 200 total points
ID: 35152294

Or you can collect it to the String like that:

String s = "";
try{
DataInputStream in = new DataInputStream(new FileInputStream(args[3]))
String buff = null;
while((buff=in.readLine() )!= null){
buff = in.readLine();
if(buff.startsWith("s") || buff.startsWith("S") || buff.startsWith("D")){
System.out.println(buff);
s += buff + System.getProperty("line.separator");
}

}
in.close();
} catch(Exception ex){
ex.printStackTrace();
}
0
 
LVL 47

Expert Comment

by:for_yan
ID: 35152303
I guess in the first case I missed one closing brace;
in the second case should be OK
0
 
LVL 86

Assisted Solution

by:CEHJ
CEHJ earned 50 total points
ID: 35152321
Try the following (the superclass is at http://technojeeves.com/joomla/index.php/free/74-string-list ) and try it out with a file called 'x.txt'
public class SelectiveStringList extends StringList {

    @Override
    public boolean add(String s) {
	boolean result = s.matches("^[sDd].*");
	if (result) {
	    super.add(s);
	}
	return result;
    }
    public static void main(String[] args) {
	SelectiveStringList matches = new SelectiveStringList();
	matches.read("x.txt");
	for(String s :  matches) {
	    System.out.println(s);
	}
    }
}

Open in new window

0
 
LVL 47

Expert Comment

by:for_yan
ID: 35152360
Sorry one readline() too much in my code
0
 
LVL 47

Expert Comment

by:for_yan
ID: 35152365
Just remobve first line inside the while loop
0

Featured Post

Salesforce Made Easy to Use

On-screen guidance at the moment of need enables you & your employees to focus on the core, you can now boost your adoption rates swiftly and simply with one easy tool.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
In this post we will learn how to make Android Gesture Tutorial and give different functionality whenever a user Touch or Scroll android screen.
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.

690 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question