001 /*
002 * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025
026 package java.nio.channels;
027
028 import java.io.IOException;
029 import java.nio.channels.spi.*;
030
031 /**
032 * A pair of channels that implements a unidirectional pipe.
033 *
034 * <p> A pipe consists of a pair of channels: A writable {@link
035 * Pipe.SinkChannel </code>sink<code>} channel and a readable {@link
036 * Pipe.SourceChannel </code>source<code>} channel. Once some bytes are
037 * written to the sink channel they can be read from source channel in exactly
038 * the order in which they were written.
039 *
040 * <p> Whether or not a thread writing bytes to a pipe will block until another
041 * thread reads those bytes, or some previously-written bytes, from the pipe is
042 * system-dependent and therefore unspecified. Many pipe implementations will
043 * buffer up to a certain number of bytes between the sink and source channels,
044 * but such buffering should not be assumed. </p>
045 *
046 *
047 * @author Mark Reinhold
048 * @author JSR-51 Expert Group
049 * @version 1.27, 07/05/05
050 * @since 1.4
051 */
052
053 public abstract class Pipe {
054
055 /**
056 * A channel representing the readable end of a {@link Pipe}. </p>
057 *
058 * @since 1.4
059 */
060 public static abstract class SourceChannel extends
061 AbstractSelectableChannel implements ReadableByteChannel,
062 ScatteringByteChannel {
063 /**
064 * Constructs a new instance of this class.
065 */
066 protected SourceChannel(SelectorProvider provider) {
067 super (provider);
068 }
069
070 /**
071 * Returns an operation set identifying this channel's supported
072 * operations.
073 *
074 * <p> Pipe-source channels only support reading, so this method
075 * returns {@link SelectionKey#OP_READ}. </p>
076 *
077 * @return The valid-operation set
078 */
079 public final int validOps() {
080 return SelectionKey.OP_READ;
081 }
082
083 }
084
085 /**
086 * A channel representing the writable end of a {@link Pipe}. </p>
087 *
088 * @since 1.4
089 */
090 public static abstract class SinkChannel extends
091 AbstractSelectableChannel implements WritableByteChannel,
092 GatheringByteChannel {
093 /**
094 * Initializes a new instance of this class.
095 */
096 protected SinkChannel(SelectorProvider provider) {
097 super (provider);
098 }
099
100 /**
101 * Returns an operation set identifying this channel's supported
102 * operations.
103 *
104 * <p> Pipe-sink channels only support writing, so this method returns
105 * {@link SelectionKey#OP_WRITE}. </p>
106 *
107 * @return The valid-operation set
108 */
109 public final int validOps() {
110 return SelectionKey.OP_WRITE;
111 }
112
113 }
114
115 /**
116 * Initializes a new instance of this class.
117 */
118 protected Pipe() {
119 }
120
121 /**
122 * Returns this pipe's source channel. </p>
123 *
124 * @return This pipe's source channel
125 */
126 public abstract SourceChannel source();
127
128 /**
129 * Returns this pipe's sink channel. </p>
130 *
131 * @return This pipe's sink channel
132 */
133 public abstract SinkChannel sink();
134
135 /**
136 * Opens a pipe.
137 *
138 * <p> The new pipe is created by invoking the {@link
139 * java.nio.channels.spi.SelectorProvider#openPipe openPipe} method of the
140 * system-wide default {@link java.nio.channels.spi.SelectorProvider}
141 * object. </p>
142 *
143 * @return A new pipe
144 *
145 * @throws IOException
146 * If an I/O error occurs
147 */
148 public static Pipe open() throws IOException {
149 return SelectorProvider.provider().openPipe();
150 }
151
152 }
|