[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

calling system commands within Java

Posted on 2011-03-16
21
Medium Priority
?
339 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
  • 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
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
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 800 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 200 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

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

Java had always been an easily readable and understandable language.  Some relatively recent changes in the language seem to be changing this pretty fast, and anyone that had not seen any Java code for the last 5 years will possibly have issues unde…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…
This video teaches viewers about errors in exception handling.
Suggested Courses
Course of the Month17 days, 18 hours left to enroll

831 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