ProcessBuilder的使用实例
这两天准备重新把Java的基本语法读一读,在查阅java.lang时看到ProcessBuilder,里面给出的例子在机子上跑了下,总是出错。一时弄不清楚其中的“myComand”、“myArg1”、“myArg2”都是些什么鬼,分别代表什么含义?到底该怎么使用?有没有什么使用模板?显然,这是别指望在javadoc里很快找到答案。
// java.lang的Class ProcessBuilder给出的示例代码片
ProcessBuilder pb =
new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory(new File("myDir"));
File log = new File("log");
pb.redirectErrorStream(true);
pb.redirectOutput(Redirect.appendTo(log));
Process p = pb.start();
assert pb.redirectInput() == Redirect.PIPE;
assert pb.redirectOutput().file() == log;
assert p.getInputStream().read() == -1;
网上找了个相关例子,但是个Linux条件下的,对于我这种从来都是在XP文化下熏陶长大的,也压根没接触过。
于是,还是基于别人框架,略作内容和格式上调整,给出了简单的python文件的进程记录程序(见文末)。
ProcessBuilder类的初始化构造函数有两种。一种是列表型"List
总结起来,使用ProcessBuilder,我想需要注意以下两点:
1.建立或指定好输入和输出文件。
输入文件可以新建,也可以覆盖,还可以指定,本程序中采用的方式是新建,并在再次运行时覆盖。可以根据需要,加上filename.exits()来进行条件判断。
File类对象为“input”,其引用文件的文件名为“commandfile.py”,存放的是以字符串形式表示的python语言源程序行(i='Hello World'\nprint(i)\n)。需要注意,字符串的末尾一定要加上“\n”,表示在python命令行编译条件下的执行。
输出文件直接指定就行了。程序运行后,输出文件会自动新建或覆盖。
2.初始化ProcessBuilder类及主参数。
在Win10条件下,测试了下分别用“cmd”和“python”作为参数初始化ProcessBuilder类的情况,其实质就是在“运行”(win+R)中分别输入cmd和python后的命令行工作模式。
当采用前者时,通常最终输出的记录下文件会显示命令行模式的提示信息,命令行打开显示什么,它就记录下什么。
当采用后者时,除非在Python源文件中有输出或有错误,否则输出文件为空。
虽然还没有接触过项目,但估计该类在项目调试和开发中能发挥不小作用(要不也不会放在java.lang中,这可是java源文件默认import的包)。
// 简单的python文件的进程记录程序
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
public class UsageOfProcessBuilder {
public static void main(String[] args) throws IOException {
String commandfile = "i='Hello World'\nprint(i)\n"; // 命令行参数或不同编程语言的程序行
// 当用"世界你好"替换掉"Hello World"后会报错
// String commandfile = "print i\n"; // 作为验证错误输出
File input = new File("./201610/log/commandfile.py");// 新建输入文件
// ProcessBuilder的输入文件,默认是"UTF-8"编码,可以是某种程序语言的源文件;
// 未测试是否可以采用其它编码方式,如"UTF-16".
try {
input.createNewFile();// 新建输入文件(如源文件名重复,则将直接覆盖).(可用input.exist()方法进行改进.)
PrintWriter pw = new PrintWriter(input);// 初始化PrintWriter
pw.append(commandfile); // 将装有"命令行参数或不同编程语言的程序行"的String型写入输入文件
pw.flush(); // 清空PrintWriter占用的缓存
} catch (IOException e) {
e.printStackTrace();
}
File output = new File("./201610//log/log.txt");// 新建输出文件
File errout = new File("./201610/log/err.txt"); // 新建错误输出文件
try {
ProcessBuilder pb = new ProcessBuilder("python");// 初始命令,可以是cmd(Windows),也可以是sh(Linux的shell脚本),这里用到python
pb.redirectInput(input);
pb.redirectOutput(output);
pb.redirectError(errout);
pb.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}