今天闲来无事,尝试一下java的多进程,说是java的多进程,其实,我的目的还是java的io重定向。之前在我的这个博客中已经介绍过c/c++的io重定向了,这里介绍一下使用java的,首先先给出一个失败的版本。有两个文件Main.java和Test.java
Main.java是父进程,用于调用子进程Test.java
//Main.java
import 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()
{
@Override
public 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.java
import 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()
{
@Override
public 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重定向的简单示例,更多内容请关注我的详解日志。