FileDocCategorySizeDatePackage
PipeTest.javaAPI DocExample2554Sat May 18 21:55:44 BST 2002com.ronsoft.books.nio.channels

PipeTest.java

package com.ronsoft.books.nio.channels;

import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.nio.channels.Pipe;
import java.nio.channels.Channels;
import java.util.Random;

/**
 * Test Pipe objects using a worker thread.
 *
 * Created April, 2002
 * @author Ron Hitchens (ron@ronsoft.com)
 * @version $Id: PipeTest.java,v 1.2 2002/05/19 04:55:45 ron Exp $
 */
public class PipeTest
{
	public static void main (String [] argv)
		throws Exception
	{
		// wrap a channel around stdout
		WritableByteChannel out = Channels.newChannel (System.out);
		// start worker and get read end of channel
		ReadableByteChannel workerChannel = startWorker (10);
		ByteBuffer buffer = ByteBuffer.allocate (100);

		while (workerChannel.read (buffer) >= 0) {
			buffer.flip();
			out.write (buffer);
			buffer.clear();
		}
	}

	// This method could as easily return a SocketChannel or
	// FileChannel instance.
	private static ReadableByteChannel startWorker (int reps)
		throws Exception
	{
		Pipe pipe = Pipe.open();
		Worker worker = new Worker (pipe.sink(), reps);

		worker.start();

		return (pipe.source());
	}

	// -----------------------------------------------------------------

	/**
	 * A worker thread object which writes data down a channel.
	 * Note: this object knows nothing about Pipe, uses only a
	 * generic WritableByteChannel.
	 */
	private static class Worker extends Thread
	{
		WritableByteChannel channel;
		private int reps;

		Worker (WritableByteChannel channel, int reps)
		{
			this.channel = channel;
			this.reps = reps;
		}

		// thread execution begins here
		public void run()
		{
			ByteBuffer buffer = ByteBuffer.allocate (100);

			try {
				for (int i = 0; i < this.reps; i++) {
					doSomeWork (buffer);

					// channel may not take it all at once
					while (channel.write (buffer) > 0) {
						// empty
					}
				}

				this.channel.close();
			} catch (Exception e) {
				// easy way out, this is demo code
				e.printStackTrace();
			}
		}

		private String [] products = {
			"No good deed goes unpunished",
			"To be, or what?",
			"No matter where you go, there you are",
			"Just say \"Yo\"",
			"My karma ran over my dogma"
		};

		private Random rand = new Random();

		private void doSomeWork (ByteBuffer buffer)
			throws Exception
		{
			int product = rand.nextInt (products.length);

			buffer.clear();
			buffer.put (products [product].getBytes ("US-ASCII"));
			buffer.put ("\r\n".getBytes ("US-ASCII"));
			buffer.flip();
		}
	}
}