今天闲来无事,尝试一下java的多进程,说是java的多进程,其实,我的目的还是java的io重定向。之前在我的这个博客中已经介绍过c/c++的io重定向了,这里介绍一下使用java的,首先先给出一个失败的版本。有两个文件Main.java和Test.java

Main.java是父进程,用于调用子进程Test.java

  1. //Main.java
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.io.PrintWriter;
  7. import java.util.Scanner;
  8. public class Main
  9. {
  10. private static PrintWriter pw = null;
  11. private static BufferedReader br = null;
  12. public static void main(String[] args)
  13. {
  14. Runtime r = Runtime.getRuntime();
  15. try
  16. {
  17. Process p = r.exec("java -cp %classpath; Test");
  18. br = new BufferedReader(new InputStreamReader(p.getInputStream()));
  19. pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream()));
  20. String line;
  21. new Thread(new Runnable()
  22. {
  23. @Override
  24. public void run()
  25. {
  26. String line ;
  27. try
  28. {
  29. while ((line = br.readLine()) != null)
  30. {
  31. System.out.println(line);
  32. }
  33. }
  34. catch (IOException e)
  35. {
  36. e.printStackTrace();
  37. }
  38. }
  39. }).start();
  40. Scanner input = new Scanner(System.in);
  41. while ((line = input.next()) != null)
  42. {
  43. System.out.println(line);
  44. pw.print(line + '\r' + '\n');
  45. }
  46. System.out.println("end");
  47. input.close();
  48. pw.close();
  49. br.close();
  50. }
  51. catch (IOException e)
  52. {
  53. e.printStackTrace();
  54. }
  55. }
  56. }

再来是 Test.java

  1. //Test.java
  2. import java.util.Scanner;
  3. public class Test
  4. {
  5. public static void main(String[] args)
  6. {
  7. Scanner input = new Scanner(System.in);
  8. String line ;
  9. System.out.println("Hello\nWorld");
  10. new Thread(new Runnable()
  11. {
  12. @Override
  13. public void run()
  14. {
  15. int count = 0;
  16. while (true)
  17. {
  18. System.out.printf("CurrendCount: %4d\r\n", count++);
  19. try
  20. {
  21. Thread.sleep(2000);
  22. }
  23. catch (InterruptedException e)
  24. {
  25. e.printStackTrace();
  26. };
  27. }
  28. }
  29. }).start();;
  30. while ((line = input.nextLine()) != null)
  31. {
  32. System.out.println(line);
  33. }
  34. input.close();
  35. }
  36. }

首先,你需要先编译 Test.java,然后再编译运行Main.java,注意Test的路径。

也许在你尝试之后,你发现在Main中输入什么都不会有响应,之前说过,这个程序是有问题的,问题不大,关键在于输出之后没有清除缓存,解决方法为:在 Main.java 中,在这个 while 循环中加入一句 pw.flush() 即可。

  1. while ((line = input.next()) != null)
  2. {
  3. System.out.println(line);
  4. pw.print(line + '\r' + '\n');
  5. pw.flush();
  6. }

最后,再运行一次程序,发现OK,这就是Java IO重定向的简单示例,更多内容请关注我的详解日志。