linux 调用shell脚本传参
例子:
boolean execResult = true;
BufferedReader br = null;
try
{
//linux脚本test.sh需要另个入参(可以有0或多个参数)
String account = "test"
String pwd = "12345";
String shellPath = "...脚本的实际路径"
ProcessBuilder b = new ProcessBuilder("sh", "test.sh", account,
password);
b = b.directory(new File(shellPath));
Process rt = b.start();
String line = "";
//脚本返回的信息流
br = new BufferedReader(new InputStreamReader(rt.getInputStream()));
while (null != (line = br.readLine()))
{
//对结果做处理
}
rt.destroy();
}
catch (Exception e)
{
execResult = false;
}
finally
{
if (null != br)
{
IOUtils.closeQuietly(br);
}
}
java5引入了ProcessBuilder类,该类的功能于Runtime.exec系列方法相同,都是启动一个进程。
主要区别是:ProcessBuilder是可以更好控制启动的进程,且可以重用;但是exec方法没有这种效果;
ProcessBuilder是从1.5加进来的,而exec系列方法是从1.0开始就有的,后续版本不断的重载这个方法,到了1.5已经有6个之多。
但是,官方的api没有任何文档说明这个两个区别,我想主要的是OO的思想,导致了这个新类的产生,功能上没什么变化
具体内容可以参见java5的api文档或者java in a nutshell
使用ProcessBuilder的例子
package net.java2000.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
public class TestProcessBuilder {
public static void main(String args[]) throws Exception {
ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir");
builder.directory(new File("e:/"));
Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "GBK");
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
总结:
ProcessBuilder为进程提供了更多的控制,例如,可以设置当前工作目录,还可以改变环境参数。而Process的功能相对来说简单的多。
ProcessBuilder是一个final类,有两个带参数的构造方法,你可以通过构造方法来直接创建ProcessBuilder的对象。而 Process是一个抽象类,一般都通过Runtime.exec()和ProcessBuilder.start()来间接创建其实例
http://www.cnblogs.com/taven/archive/2011/12/17/2291460.html