Java tutorial
import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; public class MainClass { public static void main(String[] args) throws IOException { Pipe pipe = Pipe.open(); WritableByteChannel out = pipe.sink(); ReadableByteChannel in = pipe.source(); NumberProducer producer = new NumberProducer(out, 200); NumberConsumer consumer = new NumberConsumer(in); producer.start(); consumer.start(); } } class NumberConsumer extends Thread { private ReadableByteChannel in; public NumberConsumer(ReadableByteChannel in) { this.in = in; } public void run() { ByteBuffer sizeb = ByteBuffer.allocate(4); try { while (sizeb.hasRemaining()) in.read(sizeb); sizeb.flip(); int howMany = sizeb.getInt(); sizeb.clear(); for (int i = 0; i < howMany; i++) { while (sizeb.hasRemaining()) in.read(sizeb); sizeb.flip(); int length = sizeb.getInt(); sizeb.clear(); ByteBuffer data = ByteBuffer.allocate(length); while (data.hasRemaining()) in.read(data); BigInteger result = new BigInteger(data.array()); System.out.println(result); } } catch (IOException ex) { System.err.println(ex); } finally { try { in.close(); } catch (Exception ex) { // We tried } } } } class NumberProducer extends Thread { private WritableByteChannel out; private int howMany; public NumberProducer(WritableByteChannel out, int howMany) { this.out = out; this.howMany = howMany; } public void run() { try { ByteBuffer buffer = ByteBuffer.allocate(4); buffer.putInt(this.howMany); buffer.flip(); while (buffer.hasRemaining()) out.write(buffer); for (int i = 0; i < howMany; i++) { byte[] data = new BigInteger(Integer.toString(i)).toByteArray(); buffer = ByteBuffer.allocate(4 + data.length); buffer.putInt(data.length); buffer.put(data); buffer.flip(); while (buffer.hasRemaining()) out.write(buffer); } out.close(); System.err.println("Closed"); } catch (IOException ex) { System.err.println(ex); } } }