调用 Runtime.getRuntime.exec("javac") 可以运行javac进程,该方法回返回一个Process实例对象来代表被运行的进程(当前进程的子进程),通过实例的getXxxStream()方法可以获得子进程的IO流,下面看例子
读取进程输出:
package IOTest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadFromProcess { public static void main(String[] args) throws IOException { Process p = Runtime.getRuntime().exec("javac"); try ( BufferedReader bfReader = new BufferedReader(new InputStreamReader(p.getErrorStream(),"GBK")) ){ String line = null; while ((line = bfReader.readLine()) != null){ System.out.println(line); } }catch (IOException ex){ ex.printStackTrace(); } } }
BufferedReader bfReader = new BufferedReader(new InputStreamReader(p.getErrorStream(),"GBK"),注意这一行,getErrorStream()方法会返回一个
InputStream的实例,所以可以直接将子进程的错误输出流包装成其他进程的输入流,设置编码字符集为GBK是因为笔者当前操作系统为windows7,win7的cmd
默认编码为GBK,InputStreamReader所使用的默认字符集为utf-8,调用当前系统的命令产生的输出字符编码与cmd一致,若不指定使用GBK编码,则会产生输出乱码。
上面程序运行输出如下:
因为错误使用命令,所以产生了错误输出。
下面尝试向Process内写入数据
import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.Scanner; public class WriteToProcess { public static void main(String[] args) throws IOException{ Process p = Runtime.getRuntime().exec("java ReadStandard"); try( PrintStream printStream = new PrintStream(p.getOutputStream(),true,"utf-8"); ){ printStream.println("这是什么"); printStream.println(new WriteToProcess());} } } //定义一个可以接受标准输入的类 class ReadStandard { public static void main(String[] args){ try( Scanner scanner = new Scanner(System.in); PrintStream ps = new PrintStream(new FileOutputStream("out.txt")); ){ //只把回车作为分隔符 while (scanner.hasNext()){ ps.println("键盘输入的内容是:"+scanner.next()); ps.flush(); } }catch (IOException ex){ ex.printStackTrace(); } } }