今天闲来无事,尝试一下java的多进程,说是java的多进程,其实,我的目的还是java的io重定向。之前在我的这个博客中已经介绍过c/c++的io重定向了,这里介绍一下使用java的,首先先给出一个失败的版本。有两个文件Main.java和Test.java
Main.java是父进程,用于调用子进程Test.java
//Main.javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.util.Scanner;public class Main{private static PrintWriter pw = null;private static BufferedReader br = null;public static void main(String[] args){Runtime r = Runtime.getRuntime();try{Process p = r.exec("java -cp %classpath; Test");br = new BufferedReader(new InputStreamReader(p.getInputStream()));pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream()));String line;new Thread(new Runnable(){@Overridepublic void run(){String line ;try{while ((line = br.readLine()) != null){System.out.println(line);}}catch (IOException e){e.printStackTrace();}}}).start();Scanner input = new Scanner(System.in);while ((line = input.next()) != null){System.out.println(line);pw.print(line + '\r' + '\n');}System.out.println("end");input.close();pw.close();br.close();}catch (IOException e){e.printStackTrace();}}}
再来是 Test.java
//Test.javaimport java.util.Scanner;public class Test{public static void main(String[] args){Scanner input = new Scanner(System.in);String line ;System.out.println("Hello\nWorld");new Thread(new Runnable(){@Overridepublic void run(){int count = 0;while (true){System.out.printf("CurrendCount: %4d\r\n", count++);try{Thread.sleep(2000);}catch (InterruptedException e){e.printStackTrace();};}}}).start();;while ((line = input.nextLine()) != null){System.out.println(line);}input.close();}}
首先,你需要先编译 Test.java,然后再编译运行Main.java,注意Test的路径。
也许在你尝试之后,你发现在Main中输入什么都不会有响应,之前说过,这个程序是有问题的,问题不大,关键在于输出之后没有清除缓存,解决方法为:在 Main.java 中,在这个 while 循环中加入一句 pw.flush() 即可。
while ((line = input.next()) != null){System.out.println(line);pw.print(line + '\r' + '\n');pw.flush();}
最后,再运行一次程序,发现OK,这就是Java IO重定向的简单示例,更多内容请关注我的详解日志。