Java学习笔记(一)

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 command";一种是String数组“String...”。第一种我还没研究,也就这里介绍下第二种。

总结起来,使用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();
		}

	}
}




你可能感兴趣的:(Java)