服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用runtime.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的限制。

(t007)


扫描关注微信公众号