为什么80%的码农都做不了架构师?>>>
最近由于工作的需要,涉及到对ProcessBuilder的一些简单应用,下面简单介绍一下我的用法。
概述:
ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。
每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。
简单应用:
ProcessBuilder的应用简单来说就是,先生成一个ProcessBuilder对象:
ProcessBuilder提供了两个构造函数,ProcessBuilder(List<String> command) 和 ProcessBuilder(String... command
我这里使用的是第二个,因为是需要在Linux系统上执行shell脚本,所以,我的构造函数为:
ProcessBuilder pb = new ProcessBuilder("sh"); (ps:你也可以对应的使用“Python”或者在windows上使用“cmd”)
执行的命令的应用程序已经选好了,那我们的输入和输出呢,怎么设置,这是我们关心的地方。
推荐使用redirectInput(File file) ,让我们用这个方法来获取输入,同理使用redirectOutput(File file)
来处理输出,如果有错误的话,还需要使用redirectError(File file)
由于涉及到的参数都是File类型的,所以,你需要先生成这几个文件,然后再使用它们,说了这么多,可能感觉还是有些模糊不清,下面请见代码:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
public class ProcessBuilderSample
{
public static void main(String[] args) throws IOException
{
String file = "!/bin/sh\n"
+ "a=\'Hello world\'\n"
+ "echo $a\n";
String result = Process("sh", file);
System.out.println(result);
}
public static String Process(String command, String file)
{
File input = new File("./file.sh");
if (!input.exists())
{
try
{
input.createNewFile();
PrintWriter print = new PrintWriter(input);
print.append(file);
print.flush();
}
catch (IOException e)
{
e.printStackTrace();
}
}
String result = "SUCCESS";
try
{
File output = new File("./outfile");
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectInput(input);
pb.redirectOutput(output);
pb.start();
}
catch (IOException e)
{
result = "FAIL";
e.printStackTrace();
}
return result;
}
}
执行完后,可以去outfile里面查看执行结果,你也可以把结果读出后返回,将file.sh和outfile这两个临时文件删除。