1 /* 2 * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.nio.channels; 27 28 import java.io.IOException; 29 import java.nio.channels.spi.*; 30 31 32 /** 33 * A pair of channels that implements a unidirectional pipe. 34 * 35 * <p> A pipe consists of a pair of channels: A writable {@link 36 * Pipe.SinkChannel </code>sink<code>} channel and a readable {@link 37 * Pipe.SourceChannel </code>source<code>} channel. Once some bytes are 38 * written to the sink channel they can be read from source channel in exactly 39 * the order in which they were written. 40 * 41 * <p> Whether or not a thread writing bytes to a pipe will block until another 42 * thread reads those bytes, or some previously-written bytes, from the pipe is 43 * system-dependent and therefore unspecified. Many pipe implementations will 44 * buffer up to a certain number of bytes between the sink and source channels, 45 * but such buffering should not be assumed. </p> 46 * 47 * 48 * @author Mark Reinhold 49 * @author JSR-51 Expert Group 50 * @since 1.4 51 */ 52 53 public abstract class Pipe { 54 55 /** 56 * A channel representing the readable end of a {@link Pipe}. </p> 57 * 58 * @since 1.4 59 */ 60 public static abstract class SourceChannel 61 extends AbstractSelectableChannel 62 implements ReadableByteChannel, ScatteringByteChannel 63 { 64 /** 65 * Constructs a new instance of this class. 66 */ SourceChannel(SelectorProvider provider)67 protected SourceChannel(SelectorProvider provider) { 68 super(provider); 69 } 70 71 /** 72 * Returns an operation set identifying this channel's supported 73 * operations. 74 * 75 * <p> Pipe-source channels only support reading, so this method 76 * returns {@link SelectionKey#OP_READ}. </p> 77 * 78 * @return The valid-operation set 79 */ validOps()80 public final int validOps() { 81 return SelectionKey.OP_READ; 82 } 83 84 } 85 86 /** 87 * A channel representing the writable end of a {@link Pipe}. </p> 88 * 89 * @since 1.4 90 */ 91 public static abstract class SinkChannel 92 extends AbstractSelectableChannel 93 implements WritableByteChannel, GatheringByteChannel 94 { 95 /** 96 * Initializes a new instance of this class. 97 */ SinkChannel(SelectorProvider provider)98 protected SinkChannel(SelectorProvider provider) { 99 super(provider); 100 } 101 102 /** 103 * Returns an operation set identifying this channel's supported 104 * operations. 105 * 106 * <p> Pipe-sink channels only support writing, so this method returns 107 * {@link SelectionKey#OP_WRITE}. </p> 108 * 109 * @return The valid-operation set 110 */ validOps()111 public final int validOps() { 112 return SelectionKey.OP_WRITE; 113 } 114 115 } 116 117 /** 118 * Initializes a new instance of this class. 119 */ Pipe()120 protected Pipe() { } 121 122 /** 123 * Returns this pipe's source channel. </p> 124 * 125 * @return This pipe's source channel 126 */ source()127 public abstract SourceChannel source(); 128 129 /** 130 * Returns this pipe's sink channel. </p> 131 * 132 * @return This pipe's sink channel 133 */ sink()134 public abstract SinkChannel sink(); 135 136 /** 137 * Opens a pipe. 138 * 139 * <p> The new pipe is created by invoking the {@link 140 * java.nio.channels.spi.SelectorProvider#openPipe openPipe} method of the 141 * system-wide default {@link java.nio.channels.spi.SelectorProvider} 142 * object. </p> 143 * 144 * @return A new pipe 145 * 146 * @throws IOException 147 * If an I/O error occurs 148 */ open()149 public static Pipe open() throws IOException { 150 return SelectorProvider.provider().openPipe(); 151 } 152 153 } 154