001: /* Licensed to the Apache Software Foundation (ASF) under one or more
002: * contributor license agreements. See the NOTICE file distributed with
003: * this work for additional information regarding copyright ownership.
004: * The ASF licenses this file to You under the Apache License, Version 2.0
005: * (the "License"); you may not use this file except in compliance with
006: * the License. You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package java.nio.channels;
018:
019: import java.io.IOException;
020: import java.nio.channels.spi.AbstractSelectableChannel;
021: import java.nio.channels.spi.SelectorProvider;
022:
023: /**
024: * A pipe contains two channels. One is the writable sink channel and the other is
025: * readable source channel. When bytes are written into the writable channel they
026: * can be read from readable channel. The order of these bytes remains unchanged.
027: */
028: public abstract class Pipe {
029:
030: /**
031: * Writable sink channel for writing into.
032: */
033: public static abstract class SinkChannel extends
034: AbstractSelectableChannel implements WritableByteChannel,
035: GatheringByteChannel {
036:
037: /**
038: * The Constructor.
039: *
040: * @param provider
041: * the provider of the channel
042: */
043: protected SinkChannel(SelectorProvider provider) {
044: super (provider);
045: }
046:
047: /**
048: * Indicates this channel supports only writing.
049: *
050: * @return a static value of OP_WRITE
051: */
052: @Override
053: public final int validOps() {
054: return SelectionKey.OP_WRITE;
055: }
056: }
057:
058: /**
059: * Readable source channel for reading from.
060: */
061: public static abstract class SourceChannel extends
062: AbstractSelectableChannel implements ReadableByteChannel,
063: ScatteringByteChannel {
064:
065: /**
066: * The Constructor.
067: *
068: * @param provider
069: * the provider of the channel
070: */
071: protected SourceChannel(SelectorProvider provider) {
072: super (provider);
073: }
074:
075: /**
076: * Indicates this channel supports only reading.
077: *
078: * @return a static value of OP_READ
079: */
080: @Override
081: public final int validOps() {
082: return SelectionKey.OP_READ;
083: }
084:
085: }
086:
087: /**
088: * Initializes a pipe.
089: *
090: * @return a new instance of pipe
091: *
092: * @throws IOException
093: * if I/O error occurs
094: */
095: public static Pipe open() throws IOException {
096: return SelectorProvider.provider().openPipe();
097: }
098:
099: /**
100: * The protected constructor.
101: */
102: protected Pipe() {
103: super ();
104: }
105:
106: /**
107: * Returns the sink channel of the pipe.
108: *
109: * @return a writable sink channel of the pipe
110: */
111: public abstract SinkChannel sink();
112:
113: /**
114: * Returns the source channel of the pipe.
115: *
116: * @return a readable source channel of the pipe
117: */
118: public abstract SourceChannel source();
119:
120: }
|