java Runtime 执行exec 不能进行管道解决方案

整体2种方案(1)  写好shell 脚本,然后执行shell脚本private String  AIX_CPU_CMD="/home/ap/perfmon/cpu.sh"; /**
  * 执行命令,取得返回结果
  * 可以执行shell脚本,但是不能直接执行带有管道的命令
  * @param s
  * @return
  */
 private String exec(String s){
        String res=null;
        try{
            Process pro=Runtime.getRuntime().exec(s);
            java.io.InputStreamReader ir=new java.io.InputStreamReader(pro.getInputStream());
            LineNumberReader input=new LineNumberReader(ir);
            String line;
            while((line=input.readLine())!=null)
                  res=line;
        }catch(Exception e){
             logger.error(e);
             e.printStackTrace();
        }
        return res;
     }
  (2)  使用 sh进行执行,exec 多参数  

 

 

 

Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立性规则,但是经常需要这么做才行。
  
  以下是一个简单类的范例,展示了在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的限制。

==============================================================================

下面是完整例子:

mport java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class Test {

        private static String[] cmd = new String[] { "/bin/sh", "-c", "ps -ef|grep java" };

        /**
*       * @param args
*               */
        public static void main(String[] args) {
                try {
                        Runtime runtime = Runtime.getRuntime();
                        Process process = runtime.exec(cmd); // just for test
                        InputStreamReader reader = new InputStreamReader(process.getInputStream());
                        LineNumberReader input = new LineNumberReader(reader);
                        String line;
                        while ((line = input.readLine()) != null) {
                                System.out.println(line);
                        }
process.waitFor();
                } catch (Exception e) {
                        System.err.println("System Monitor Error" + e.toString());
                }
        }
}



http://hi.baidu.com/litertiger/item/6e1753f7ef3e920dd89e7219

你可能感兴趣的:(java Runtime 执行exec 不能进行管道解决方案)