JavaでもPerlでもデフォルトで出力がバッファリングされているので、双方で出力のバッファリングを無効、フラッシュすると良いようです。
perlの標準出力から読み取るときに待ちが発生することもあるので、読み取って表示するスレッドは別にしました。
Java
1public class Popen extends Thread
2{
3 static InputStream perlStdout = null;
4
5 public static void main(String[] args)
6 {
7 try {
8 Process process = new ProcessBuilder("C:/bin/perl", "C:/home/hello.pl").start();
9
10 // perlの標準入力を取得
11 OutputStream perlStdin = process.getOutputStream();
12 // perlの標準出力を取得
13 perlStdout = process.getInputStream();
14
15 // perlの標準出力から読み取って表示するスレッドを作成・開始
16 Popen anotherInstance = new Popen();
17 Thread perlOutputReadingThread = new Thread(anotherInstance);
18 perlOutputReadingThread.start();
19
20 // perlの標準入力へ書き込む
21 perlStdin.write("Hello World!\n".getBytes());
22 perlStdin.flush();
23
24 perlStdin.write("Bonjour le Monde!\n".getBytes());
25 perlStdin.flush();
26
27 perlStdin.write("Buongiorno il Mondo!\n".getBytes());
28 perlStdin.flush();
29
30 perlStdin.write("Good bye!\n".getBytes());
31 perlStdin.flush();
32
33 // perlの標準入力を切断
34 perlStdin.close();
35 }
36 catch (IOException e)
37 {
38 e.printStackTrace();
39 }
40 }
41
42 // perlの標準出力から読み取って表示する
43 @Override
44 public void run()
45 {
46 byte[] inputBuf = new byte[512];
47 String perlStr;
48
49 try {
50 do {
51 // 場合によっては待ちが発生することもある
52 perlStdout.read(inputBuf);
53 perlStr = new String(inputBuf);
54 System.out.print(perlStr);
55 // 読み取り可能なバイト数が 0 になるまで繰り返す
56 } while (perlStdout.available() > 0);
57 }
58 catch (IOException e)
59 {
60 System.out.println("IOException on perlOutputReadingThread");
61 }
62 System.out.println("perlOutputReadingThread exited.");
63 }
64}
Perl
1# $| 出力のバッファリング、0以外でバッファリングが無効になる
2$| = 1;
3while ($print = <STDIN>)
4{
5#Perlからの出力であることを示すために'perl:'をつけて出力
6 print 'perl:' . $print;
7}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。