java调用linux命令

java应用Runtime.exec调用linux命令
以下是一个简单类的范例,展示了在Unix下运行ls命令的情形:
  
 
 import java.io.BufferedInputStream; 
  import java.io.IOException; 
   
  public class ExecLs { 
   
   static public void main(String[] args) { 
   String cmd = "ls" 
   
   try { 
   Process ps = Runtime.getRuntime().exec(cmds); 
   System.out.print(loadStream(ps.getInputStream())); 
   System.err.print(loadStream(ps.getErrorStream())); 
   } catch(IOException ioe) { 
   ioe.printStackTrace(); 
   } 
   } 
   
   // read an input-stream into a String 
   static String loadStream(InputStream in) throws IOException { 
   int ptr = 0; 
   in = new BufferedInputStream(in); 
   StringBuffer buffer = new StringBuffer(); 
   while( (ptr = in.read()) != -1 ) { 
   buffer.append((char)ptr); 
   } 
   return buffer.toString(); 
   
   } 


上述代码中重要的部分是exec方法和命令字符串ls。本程序将输出运行目录下的列表细节。
  
  那么,如果你想重定向这些细节内容到文件该怎么办?这一命令行的输入应该写成ls > FILE,但是当你将cmd变量改变成这样的话,运行就会出错,如下:
  
  /bin/ls: >: No such file or directory
  /bin/ls: FILE: No such file or directory
  
  出错的原因在于额外的参数被直接传送到了ls命令而不是送到实际的命令行。解决这一问题的办法是将cmd串弄成一个字符串数组,并且将你想运行的程序传送到命令shell。
  
  因此,将cmd行改成下面的样子:
  
   String[] cmd = { "sh", "-c", "ls > FILE" };
  
  你将得到一个名为FILE的文件,里面是目录列表。-c参数是告诉它读取随后的字符串,而最后的参数是你要运行的脚本。
  
  在这种情况下,管道也运行良好,所以你可以把命令改成下面的方式:
  
  String[] cmd = { "/bin/sh", "-c", "/bin/ls | grep d > FILE" };
  
  这种形式将给你一个名为FILE的文件,里面是ls条目中包含d的条目。给出sh和ls的全路径有利于提供你的程序的安全性。
  
  虽然使用Runtime.exec不是创建独立于平台的Java的最佳方式,但是有些时候是必要的。使用这种重定向技术有助于走出Runtime.exec的限制。

说明:
1.     exec的必须是可执行的程序,如果是命令行的命令则还需另外处理
2.     在windows中process = runtime.exec(new String[] { "cmd.exe","/C", "dir"});
3.     在linux中process = runtime.exec(new String[] { "/bin/sh","-c", "echo $PATH"});

猜你喜欢

转载自liang100100.iteye.com/blog/2215400