Java技巧:使用Runtime.exec重定向本地程序调用

Java技巧:使用Runtime.exec重定向本地程序调用,第1张

Java具有使用Runtime exec对本地程序调用进行重定向的能力 但是用重定向或者管道进行命令调用将会出错 解决这一问题的办法是通过命令shell运行命令 在Java中调用本地程序会破坏平台独立性规则 但是经常需要这么做才行 以下是一个简单类的范例 展示了在Unix下运行ls命令的情形 import java io BufferedInputStreamimport java io IOExceptionpublic 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 = in = new BufferedInputStream(in)StringBuffer buffer = new StringBuffer()while( (ptr = in read()) != ) { 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的限制 lishixinzhi/Article/program/Java/hx/201311/25922

那就把exe上传到项目里,然后用程序在项目中的路径,这样就不必改来汪核唯改去了。当然你也可以采用配置的方法,譬如properties文件,把位置信息存在properties文件中,路径动态的读取出来氏铅,同样可以达到目的困培。

Java可以通过Runtime调用Linux命令御逗咐,形式如下:

Runtime.getRuntime().exec(command)

但是这样执行时没有任何输出,因为调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例(注意:Runtime.getRuntime().exec(command)返指宽回的是一个Process类的实例)该实例可用于控制进程或取得进程的相关信息。

由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向给它的父进程了。

用户需要用这些stream来向子进程输入数据或获取子进程的输出,下面的代码可以取到linux命令的执行结果:

try{

String[]cmd=newString[]{”镇纯/bin/sh”,“-c”,”ls“}

Processps=Runtime.getRuntime().exec(cmd)

BufferedReaderbr=newBufferedReader(newInputStreamReader(ps.getInputStream()))

StringBuffersb=newStringBuffer()

Stringline

while((line=br.readLine())!=null){

sb.append(line).append(”\n”)

}

Stringresult=sb.toString()

System.out.println(result)

}catch(Exceptione){

e.printStackTrace()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12417547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存