import java.io.*; class Streamer extends Thread { /* Helper thread that passes every line of a Reader stream to output */ String stream_name; BufferedReader str; public Streamer(BufferedReader s, String name) { str = s; stream_name = name; } public void run() { try { while (true) { String line = str.readLine(); if (line==null) break; System.out.println(line); } System.out.println(stream_name + " terminated"); } catch (Exception e) { System.out.println("Exception: " + e);} } } public class MemRelay { public static void main(String[] argv) { try { Runtime rt = Runtime.getRuntime(); Process w = rt.exec("./writer"); Process r = rt.exec("./reader"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedReader w_input = new BufferedReader(new InputStreamReader(w.getInputStream())) ; BufferedReader w_error = new BufferedReader(new InputStreamReader(w.getErrorStream())) ; PrintWriter w_output = new PrintWriter(w.getOutputStream()); BufferedReader r_input = new BufferedReader(new InputStreamReader(r.getInputStream())) ; BufferedReader r_error = new BufferedReader(new InputStreamReader(r.getErrorStream())) ; PrintWriter r_output = new PrintWriter(r.getOutputStream()); // Stream error channels to output Streamer s_w = new Streamer(w_error,"Writer "); Streamer s_r = new Streamer(r_error,"Reader "); s_w.start(); s_r.start(); Thread.sleep(500); // Give way for messages on error channels try { while (true) { System.out.print("> "); String line = in.readLine(); if (line==null) break; // Send line to writer w_output.println("<" + line + ">"); w_output.flush(); // Await that line has been passed to memory String answer = w_input.readLine(); if (answer==null || !answer.equals("OK")) break; // Pass on OK-signal to reader r_output.println(answer); r_output.flush(); // Await reader to send line String newline = r_input.readLine(); if (newline==null) break; System.out.println("* " + newline); } w_output.close(); r_output.close(); } catch (IOException ioe) {} System.out.println("Exit value writer= " + w.waitFor()); System.out.println("Exit value reader= " + r.waitFor()); } catch (Exception e) { System.out.println("Exception: " + e);} } }