Showing the changes to java/pkg/java/nio/channels (86 of 18352 files). Show all
Unified · Split
Binary file not shown.
| @@ -0,0 +1,209 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.nio.ByteBuffer; | |
| 29 | +import java.util.concurrent.Future; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * An asynchronous channel that can read and write bytes. | |
| 33 | + * | |
| 34 | + * <p> Some channels may not allow more than one read or write to be outstanding | |
| 35 | + * at any given time. If a thread invokes a read method before a previous read | |
| 36 | + * operation has completed then a {@link ReadPendingException} will be thrown. | |
| 37 | + * Similarly, if a write method is invoked before a previous write has completed | |
| 38 | + * then {@link WritePendingException} is thrown. Whether or not other kinds of | |
| 39 | + * I/O operations may proceed concurrently with a read operation depends upon | |
| 40 | + * the type of the channel. | |
| 41 | + * | |
| 42 | + * <p> Note that {@link java.nio.ByteBuffer ByteBuffers} are not safe for use by | |
| 43 | + * multiple concurrent threads. When a read or write operation is initiated then | |
| 44 | + * care must be taken to ensure that the buffer is not accessed until the | |
| 45 | + * operation completes. | |
| 46 | + * | |
| 47 | + * @see Channels#newInputStream(AsynchronousByteChannel) | |
| 48 | + * @see Channels#newOutputStream(AsynchronousByteChannel) | |
| 49 | + * | |
| 50 | + * @since 1.7 | |
| 51 | + */ | |
| 52 | + | |
| 53 | +public interface AsynchronousByteChannel | |
| 54 | + extends AsynchronousChannel | |
| 55 | +{ | |
| 56 | + /** | |
| 57 | + * Reads a sequence of bytes from this channel into the given buffer. | |
| 58 | + * | |
| 59 | + * <p> This method initiates an asynchronous read operation to read a | |
| 60 | + * sequence of bytes from this channel into the given buffer. The {@code | |
| 61 | + * handler} parameter is a completion handler that is invoked when the read | |
| 62 | + * operation completes (or fails). The result passed to the completion | |
| 63 | + * handler is the number of bytes read or {@code -1} if no bytes could be | |
| 64 | + * read because the channel has reached end-of-stream. | |
| 65 | + * | |
| 66 | + * <p> The read operation may read up to <i>r</i> bytes from the channel, | |
| 67 | + * where <i>r</i> is the number of bytes remaining in the buffer, that is, | |
| 68 | + * {@code dst.remaining()} at the time that the read is attempted. Where | |
| 69 | + * <i>r</i> is 0, the read operation completes immediately with a result of | |
| 70 | + * {@code 0} without initiating an I/O operation. | |
| 71 | + * | |
| 72 | + * <p> Suppose that a byte sequence of length <i>n</i> is read, where | |
| 73 | + * <tt>0</tt> <tt><</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 74 | + * This byte sequence will be transferred into the buffer so that the first | |
| 75 | + * byte in the sequence is at index <i>p</i> and the last byte is at index | |
| 76 | + * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>, | |
| 77 | + * where <i>p</i> is the buffer's position at the moment the read is | |
| 78 | + * performed. Upon completion the buffer's position will be equal to | |
| 79 | + * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. | |
| 80 | + * | |
| 81 | + * <p> Buffers are not safe for use by multiple concurrent threads so care | |
| 82 | + * should be taken to not access the buffer until the operation has | |
| 83 | + * completed. | |
| 84 | + * | |
| 85 | + * <p> This method may be invoked at any time. Some channel types may not | |
| 86 | + * allow more than one read to be outstanding at any given time. If a thread | |
| 87 | + * initiates a read operation before a previous read operation has | |
| 88 | + * completed then a {@link ReadPendingException} will be thrown. | |
| 89 | + * | |
| 90 | + * @param dst | |
| 91 | + * The buffer into which bytes are to be transferred | |
| 92 | + * @param attachment | |
| 93 | + * The object to attach to the I/O operation; can be {@code null} | |
| 94 | + * @param handler | |
| 95 | + * The completion handler | |
| 96 | + * | |
| 97 | + * @throws IllegalArgumentException | |
| 98 | + * If the buffer is read-only | |
| 99 | + * @throws ReadPendingException | |
| 100 | + * If the channel does not allow more than one read to be outstanding | |
| 101 | + * and a previous read has not completed | |
| 102 | + * @throws ShutdownChannelGroupException | |
| 103 | + * If the channel is associated with a {@link AsynchronousChannelGroup | |
| 104 | + * group} that has terminated | |
| 105 | + */ | |
| 106 | + <A> void read(ByteBuffer dst, | |
| 107 | + A attachment, | |
| 108 | + CompletionHandler<Integer,? super A> handler); | |
| 109 | + | |
| 110 | + /** | |
| 111 | + * Reads a sequence of bytes from this channel into the given buffer. | |
| 112 | + * | |
| 113 | + * <p> This method initiates an asynchronous read operation to read a | |
| 114 | + * sequence of bytes from this channel into the given buffer. The method | |
| 115 | + * behaves in exactly the same manner as the {@link | |
| 116 | + * #read(ByteBuffer,Object,CompletionHandler) | |
| 117 | + * read(ByteBuffer,Object,CompletionHandler)} method except that instead | |
| 118 | + * of specifying a completion handler, this method returns a {@code Future} | |
| 119 | + * representing the pending result. The {@code Future}'s {@link Future#get() | |
| 120 | + * get} method returns the number of bytes read or {@code -1} if no bytes | |
| 121 | + * could be read because the channel has reached end-of-stream. | |
| 122 | + * | |
| 123 | + * @param dst | |
| 124 | + * The buffer into which bytes are to be transferred | |
| 125 | + * | |
| 126 | + * @return A Future representing the result of the operation | |
| 127 | + * | |
| 128 | + * @throws IllegalArgumentException | |
| 129 | + * If the buffer is read-only | |
| 130 | + * @throws ReadPendingException | |
| 131 | + * If the channel does not allow more than one read to be outstanding | |
| 132 | + * and a previous read has not completed | |
| 133 | + */ | |
| 134 | + Future<Integer> read(ByteBuffer dst); | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Writes a sequence of bytes to this channel from the given buffer. | |
| 138 | + * | |
| 139 | + * <p> This method initiates an asynchronous write operation to write a | |
| 140 | + * sequence of bytes to this channel from the given buffer. The {@code | |
| 141 | + * handler} parameter is a completion handler that is invoked when the write | |
| 142 | + * operation completes (or fails). The result passed to the completion | |
| 143 | + * handler is the number of bytes written. | |
| 144 | + * | |
| 145 | + * <p> The write operation may write up to <i>r</i> bytes to the channel, | |
| 146 | + * where <i>r</i> is the number of bytes remaining in the buffer, that is, | |
| 147 | + * {@code src.remaining()} at the time that the write is attempted. Where | |
| 148 | + * <i>r</i> is 0, the write operation completes immediately with a result of | |
| 149 | + * {@code 0} without initiating an I/O operation. | |
| 150 | + * | |
| 151 | + * <p> Suppose that a byte sequence of length <i>n</i> is written, where | |
| 152 | + * <tt>0</tt> <tt><</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 153 | + * This byte sequence will be transferred from the buffer starting at index | |
| 154 | + * <i>p</i>, where <i>p</i> is the buffer's position at the moment the | |
| 155 | + * write is performed; the index of the last byte written will be | |
| 156 | + * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>. | |
| 157 | + * Upon completion the buffer's position will be equal to | |
| 158 | + * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. | |
| 159 | + * | |
| 160 | + * <p> Buffers are not safe for use by multiple concurrent threads so care | |
| 161 | + * should be taken to not access the buffer until the operation has | |
| 162 | + * completed. | |
| 163 | + * | |
| 164 | + * <p> This method may be invoked at any time. Some channel types may not | |
| 165 | + * allow more than one write to be outstanding at any given time. If a thread | |
| 166 | + * initiates a write operation before a previous write operation has | |
| 167 | + * completed then a {@link WritePendingException} will be thrown. | |
| 168 | + * | |
| 169 | + * @param src | |
| 170 | + * The buffer from which bytes are to be retrieved | |
| 171 | + * @param attachment | |
| 172 | + * The object to attach to the I/O operation; can be {@code null} | |
| 173 | + * @param handler | |
| 174 | + * The completion handler object | |
| 175 | + * | |
| 176 | + * @throws WritePendingException | |
| 177 | + * If the channel does not allow more than one write to be outstanding | |
| 178 | + * and a previous write has not completed | |
| 179 | + * @throws ShutdownChannelGroupException | |
| 180 | + * If the channel is associated with a {@link AsynchronousChannelGroup | |
| 181 | + * group} that has terminated | |
| 182 | + */ | |
| 183 | + <A> void write(ByteBuffer src, | |
| 184 | + A attachment, | |
| 185 | + CompletionHandler<Integer,? super A> handler); | |
| 186 | + | |
| 187 | + /** | |
| 188 | + * Writes a sequence of bytes to this channel from the given buffer. | |
| 189 | + * | |
| 190 | + * <p> This method initiates an asynchronous write operation to write a | |
| 191 | + * sequence of bytes to this channel from the given buffer. The method | |
| 192 | + * behaves in exactly the same manner as the {@link | |
| 193 | + * #write(ByteBuffer,Object,CompletionHandler) | |
| 194 | + * write(ByteBuffer,Object,CompletionHandler)} method except that instead | |
| 195 | + * of specifying a completion handler, this method returns a {@code Future} | |
| 196 | + * representing the pending result. The {@code Future}'s {@link Future#get() | |
| 197 | + * get} method returns the number of bytes written. | |
| 198 | + * | |
| 199 | + * @param src | |
| 200 | + * The buffer from which bytes are to be retrieved | |
| 201 | + * | |
| 202 | + * @return A Future representing the result of the operation | |
| 203 | + * | |
| 204 | + * @throws WritePendingException | |
| 205 | + * If the channel does not allow more than one write to be outstanding | |
| 206 | + * and a previous write has not completed | |
| 207 | + */ | |
| 208 | + Future<Integer> write(ByteBuffer src); | |
| 209 | +} | |
Binary file not shown.
| @@ -0,0 +1,117 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.util.concurrent.Future; // javadoc | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * A channel that supports asynchronous I/O operations. Asynchronous I/O | |
| 33 | + * operations will usually take one of two forms: | |
| 34 | + * | |
| 35 | + * <ol> | |
| 36 | + * <li><pre>{@link Future}<V> <em>operation</em>(<em>...</em>)</pre></li> | |
| 37 | + * <li><pre>void <em>operation</em>(<em>...</em> A attachment, {@link | |
| 38 | + * CompletionHandler}<V,? super A> handler)</pre></li> | |
| 39 | + * </ol> | |
| 40 | + * | |
| 41 | + * where <i>operation</i> is the name of the I/O operation (read or write for | |
| 42 | + * example), <i>V</i> is the result type of the I/O operation, and <i>A</i> is | |
| 43 | + * the type of an object attached to the I/O operation to provide context when | |
| 44 | + * consuming the result. The attachment is important for cases where a | |
| 45 | + * <em>state-less</em> {@code CompletionHandler} is used to consume the result | |
| 46 | + * of many I/O operations. | |
| 47 | + * | |
| 48 | + * <p> In the first form, the methods defined by the {@link Future Future} | |
| 49 | + * interface may be used to check if the operation has completed, wait for its | |
| 50 | + * completion, and to retrieve the result. In the second form, a {@link | |
| 51 | + * CompletionHandler} is invoked to consume the result of the I/O operation when | |
| 52 | + * it completes or fails. | |
| 53 | + * | |
| 54 | + * <p> A channel that implements this interface is <em>asynchronously | |
| 55 | + * closeable</em>: If an I/O operation is outstanding on the channel and the | |
| 56 | + * channel's {@link #close close} method is invoked, then the I/O operation | |
| 57 | + * fails with the exception {@link AsynchronousCloseException}. | |
| 58 | + * | |
| 59 | + * <p> Asynchronous channels are safe for use by multiple concurrent threads. | |
| 60 | + * Some channel implementations may support concurrent reading and writing, but | |
| 61 | + * may not allow more than one read and one write operation to be outstanding at | |
| 62 | + * any given time. | |
| 63 | + * | |
| 64 | + * <h4>Cancellation</h4> | |
| 65 | + * | |
| 66 | + * <p> The {@code Future} interface defines the {@link Future#cancel cancel} | |
| 67 | + * method to cancel execution. This causes all threads waiting on the result of | |
| 68 | + * the I/O operation to throw {@link java.util.concurrent.CancellationException}. | |
| 69 | + * Whether the underlying I/O operation can be cancelled is highly implementation | |
| 70 | + * specific and therefore not specified. Where cancellation leaves the channel, | |
| 71 | + * or the entity to which it is connected, in an inconsistent state, then the | |
| 72 | + * channel is put into an implementation specific <em>error state</em> that | |
| 73 | + * prevents further attempts to initiate I/O operations that are <i>similar</i> | |
| 74 | + * to the operation that was cancelled. For example, if a read operation is | |
| 75 | + * cancelled but the implementation cannot guarantee that bytes have not been | |
| 76 | + * read from the channel then it puts the channel into an error state; further | |
| 77 | + * attempts to initiate a {@code read} operation cause an unspecified runtime | |
| 78 | + * exception to be thrown. Similarly, if a write operation is cancelled but the | |
| 79 | + * implementation cannot guarantee that bytes have not been written to the | |
| 80 | + * channel then subsequent attempts to initiate a {@code write} will fail with | |
| 81 | + * an unspecified runtime exception. | |
| 82 | + * | |
| 83 | + * <p> Where the {@link Future#cancel cancel} method is invoked with the {@code | |
| 84 | + * mayInterruptIfRunning} parameter set to {@code true} then the I/O operation | |
| 85 | + * may be interrupted by closing the channel. In that case all threads waiting | |
| 86 | + * on the result of the I/O operation throw {@code CancellationException} and | |
| 87 | + * any other I/O operations outstanding on the channel complete with the | |
| 88 | + * exception {@link AsynchronousCloseException}. | |
| 89 | + * | |
| 90 | + * <p> Where the {@code cancel} method is invoked to cancel read or write | |
| 91 | + * operations then it is recommended that all buffers used in the I/O operations | |
| 92 | + * be discarded or care taken to ensure that the buffers are not accessed while | |
| 93 | + * the channel remains open. | |
| 94 | + * | |
| 95 | + * @since 1.7 | |
| 96 | + */ | |
| 97 | + | |
| 98 | +public interface AsynchronousChannel | |
| 99 | + extends Channel | |
| 100 | +{ | |
| 101 | + /** | |
| 102 | + * Closes this channel. | |
| 103 | + * | |
| 104 | + * <p> Any outstanding asynchronous operations upon this channel will | |
| 105 | + * complete with the exception {@link AsynchronousCloseException}. After a | |
| 106 | + * channel is closed, further attempts to initiate asynchronous I/O | |
| 107 | + * operations complete immediately with cause {@link ClosedChannelException}. | |
| 108 | + * | |
| 109 | + * <p> This method otherwise behaves exactly as specified by the {@link | |
| 110 | + * Channel} interface. | |
| 111 | + * | |
| 112 | + * @throws IOException | |
| 113 | + * If an I/O error occurs | |
| 114 | + */ | |
| 115 | + @Override | |
| 116 | + void close() throws IOException; | |
| 117 | +} | |
Binary file not shown.
| @@ -0,0 +1,344 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.nio.channels.spi.AsynchronousChannelProvider; | |
| 29 | +import java.io.IOException; | |
| 30 | +import java.util.concurrent.ExecutorService; | |
| 31 | +import java.util.concurrent.ThreadFactory; | |
| 32 | +import java.util.concurrent.TimeUnit; | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * A grouping of asynchronous channels for the purpose of resource sharing. | |
| 36 | + * | |
| 37 | + * <p> An asynchronous channel group encapsulates the mechanics required to | |
| 38 | + * handle the completion of I/O operations initiated by {@link AsynchronousChannel | |
| 39 | + * asynchronous channels} that are bound to the group. A group has an associated | |
| 40 | + * thread pool to which tasks are submitted to handle I/O events and dispatch to | |
| 41 | + * {@link CompletionHandler completion-handlers} that consume the result of | |
| 42 | + * asynchronous operations performed on channels in the group. In addition to | |
| 43 | + * handling I/O events, the pooled threads may also execute other tasks required | |
| 44 | + * to support the execution of asynchronous I/O operations. | |
| 45 | + * | |
| 46 | + * <p> An asynchronous channel group is created by invoking the {@link | |
| 47 | + * #withFixedThreadPool withFixedThreadPool} or {@link #withCachedThreadPool | |
| 48 | + * withCachedThreadPool} methods defined here. Channels are bound to a group by | |
| 49 | + * specifying the group when constructing the channel. The associated thread | |
| 50 | + * pool is <em>owned</em> by the group; termination of the group results in the | |
| 51 | + * shutdown of the associated thread pool. | |
| 52 | + * | |
| 53 | + * <p> In addition to groups created explicitly, the Java virtual machine | |
| 54 | + * maintains a system-wide <em>default group</em> that is constructed | |
| 55 | + * automatically. Asynchronous channels that do not specify a group at | |
| 56 | + * construction time are bound to the default group. The default group has an | |
| 57 | + * associated thread pool that creates new threads as needed. The default group | |
| 58 | + * may be configured by means of system properties defined in the table below. | |
| 59 | + * Where the {@link java.util.concurrent.ThreadFactory ThreadFactory} for the | |
| 60 | + * default group is not configured then the pooled threads of the default group | |
| 61 | + * are {@link Thread#isDaemon daemon} threads. | |
| 62 | + * | |
| 63 | + * <table border> | |
| 64 | + * <tr> | |
| 65 | + * <th>System property</th> | |
| 66 | + * <th>Description</th> | |
| 67 | + * </tr> | |
| 68 | + * <tr> | |
| 69 | + * <tr> | |
| 70 | + * <td> {@code java.nio.channels.DefaultThreadPool.threadFactory} </td> | |
| 71 | + * <td> The value of this property is taken to be the fully-qualified name | |
| 72 | + * of a concrete {@link java.util.concurrent.ThreadFactory ThreadFactory} | |
| 73 | + * class. The class is loaded using the system class loader and instantiated. | |
| 74 | + * The factory's {@link java.util.concurrent.ThreadFactory#newThread | |
| 75 | + * newThread} method is invoked to create each thread for the default | |
| 76 | + * group's thread pool. If the process to load and instantiate the value | |
| 77 | + * of the property fails then an unspecified error is thrown during the | |
| 78 | + * construction of the default group. </td> | |
| 79 | + * </tr> | |
| 80 | + * <tr> | |
| 81 | + * <td> {@code java.nio.channels.DefaultThreadPool.initialSize} </td> | |
| 82 | + * <td> The value of the {@code initialSize} parameter for the default | |
| 83 | + * group (see {@link #withCachedThreadPool withCachedThreadPool}). | |
| 84 | + * The value of the property is taken to be the {@code String} | |
| 85 | + * representation of an {@code Integer} that is the initial size parameter. | |
| 86 | + * If the value cannot be parsed as an {@code Integer} it causes an | |
| 87 | + * unspecified error to be thrown during the construction of the default | |
| 88 | + * group. </td> | |
| 89 | + * </tr> | |
| 90 | + * </table> | |
| 91 | + * | |
| 92 | + * <a name="threading"><h4>Threading</h4></a> | |
| 93 | + * | |
| 94 | + * <p> The completion handler for an I/O operation initiated on a channel bound | |
| 95 | + * to a group is guaranteed to be invoked by one of the pooled threads in the | |
| 96 | + * group. This ensures that the completion handler is run by a thread with the | |
| 97 | + * expected <em>identity</em>. | |
| 98 | + * | |
| 99 | + * <p> Where an I/O operation completes immediately, and the initiating thread | |
| 100 | + * is one of the pooled threads in the group then the completion handler may | |
| 101 | + * be invoked directly by the initiating thread. To avoid stack overflow, an | |
| 102 | + * implementation may impose a limit as to the number of activations on the | |
| 103 | + * thread stack. Some I/O operations may prohibit invoking the completion | |
| 104 | + * handler directly by the initiating thread (see {@link | |
| 105 | + * AsynchronousServerSocketChannel#accept(Object,CompletionHandler) accept}). | |
| 106 | + * | |
| 107 | + * <a name="shutdown"><h4>Shutdown and Termination</h4></a> | |
| 108 | + * | |
| 109 | + * <p> The {@link #shutdown() shutdown} method is used to initiate an <em>orderly | |
| 110 | + * shutdown</em> of a group. An orderly shutdown marks the group as shutdown; | |
| 111 | + * further attempts to construct a channel that binds to the group will throw | |
| 112 | + * {@link ShutdownChannelGroupException}. Whether or not a group is shutdown can | |
| 113 | + * be tested using the {@link #isShutdown() isShutdown} method. Once shutdown, | |
| 114 | + * the group <em>terminates</em> when all asynchronous channels that are bound to | |
| 115 | + * the group are closed, all actively executing completion handlers have run to | |
| 116 | + * completion, and resources used by the group are released. No attempt is made | |
| 117 | + * to stop or interrupt threads that are executing completion handlers. The | |
| 118 | + * {@link #isTerminated() isTerminated} method is used to test if the group has | |
| 119 | + * terminated, and the {@link #awaitTermination awaitTermination} method can be | |
| 120 | + * used to block until the group has terminated. | |
| 121 | + * | |
| 122 | + * <p> The {@link #shutdownNow() shutdownNow} method can be used to initiate a | |
| 123 | + * <em>forceful shutdown</em> of the group. In addition to the actions performed | |
| 124 | + * by an orderly shutdown, the {@code shutdownNow} method closes all open channels | |
| 125 | + * in the group as if by invoking the {@link AsynchronousChannel#close close} | |
| 126 | + * method. | |
| 127 | + * | |
| 128 | + * @since 1.7 | |
| 129 | + * | |
| 130 | + * @see AsynchronousSocketChannel#open(AsynchronousChannelGroup) | |
| 131 | + * @see AsynchronousServerSocketChannel#open(AsynchronousChannelGroup) | |
| 132 | + */ | |
| 133 | + | |
| 134 | +public abstract class AsynchronousChannelGroup { | |
| 135 | + private final AsynchronousChannelProvider provider; | |
| 136 | + | |
| 137 | + /** | |
| 138 | + * Initialize a new instance of this class. | |
| 139 | + * | |
| 140 | + * @param provider | |
| 141 | + * The asynchronous channel provider for this group | |
| 142 | + */ | |
| 143 | + protected AsynchronousChannelGroup(AsynchronousChannelProvider provider) { | |
| 144 | + this.provider = provider; | |
| 145 | + } | |
| 146 | + | |
| 147 | + /** | |
| 148 | + * Returns the provider that created this channel group. | |
| 149 | + * | |
| 150 | + * @return The provider that created this channel group | |
| 151 | + */ | |
| 152 | + public final AsynchronousChannelProvider provider() { | |
| 153 | + return provider; | |
| 154 | + } | |
| 155 | + | |
| 156 | + /** | |
| 157 | + * Creates an asynchronous channel group with a fixed thread pool. | |
| 158 | + * | |
| 159 | + * <p> The resulting asynchronous channel group reuses a fixed number of | |
| 160 | + * threads. At any point, at most {@code nThreads} threads will be active | |
| 161 | + * processing tasks that are submitted to handle I/O events and dispatch | |
| 162 | + * completion results for operations initiated on asynchronous channels in | |
| 163 | + * the group. | |
| 164 | + * | |
| 165 | + * <p> The group is created by invoking the {@link | |
| 166 | + * AsynchronousChannelProvider#openAsynchronousChannelGroup(int,ThreadFactory) | |
| 167 | + * openAsynchronousChannelGroup(int,ThreadFactory)} method of the system-wide | |
| 168 | + * default {@link AsynchronousChannelProvider} object. | |
| 169 | + * | |
| 170 | + * @param nThreads | |
| 171 | + * The number of threads in the pool | |
| 172 | + * @param threadFactory | |
| 173 | + * The factory to use when creating new threads | |
| 174 | + * | |
| 175 | + * @return A new asynchronous channel group | |
| 176 | + * | |
| 177 | + * @throws IllegalArgumentException | |
| 178 | + * If {@code nThreads <= 0} | |
| 179 | + * @throws IOException | |
| 180 | + * If an I/O error occurs | |
| 181 | + */ | |
| 182 | + public static AsynchronousChannelGroup withFixedThreadPool(int nThreads, | |
| 183 | + ThreadFactory threadFactory) | |
| 184 | + throws IOException | |
| 185 | + { | |
| 186 | + return AsynchronousChannelProvider.provider() | |
| 187 | + .openAsynchronousChannelGroup(nThreads, threadFactory); | |
| 188 | + } | |
| 189 | + | |
| 190 | + /** | |
| 191 | + * Creates an asynchronous channel group with a given thread pool that | |
| 192 | + * creates new threads as needed. | |
| 193 | + * | |
| 194 | + * <p> The {@code executor} parameter is an {@code ExecutorService} that | |
| 195 | + * creates new threads as needed to execute tasks that are submitted to | |
| 196 | + * handle I/O events and dispatch completion results for operations initiated | |
| 197 | + * on asynchronous channels in the group. It may reuse previously constructed | |
| 198 | + * threads when they are available. | |
| 199 | + * | |
| 200 | + * <p> The {@code initialSize} parameter may be used by the implementation | |
| 201 | + * as a <em>hint</em> as to the initial number of tasks it may submit. For | |
| 202 | + * example, it may be used to indictae the initial number of threads that | |
| 203 | + * wait on I/O events. | |
| 204 | + * | |
| 205 | + * <p> The executor is intended to be used exclusively by the resulting | |
| 206 | + * asynchronous channel group. Termination of the group results in the | |
| 207 | + * orderly {@link ExecutorService#shutdown shutdown} of the executor | |
| 208 | + * service. Shutting down the executor service by other means results in | |
| 209 | + * unspecified behavior. | |
| 210 | + * | |
| 211 | + * <p> The group is created by invoking the {@link | |
| 212 | + * AsynchronousChannelProvider#openAsynchronousChannelGroup(ExecutorService,int) | |
| 213 | + * openAsynchronousChannelGroup(ExecutorService,int)} method of the system-wide | |
| 214 | + * default {@link AsynchronousChannelProvider} object. | |
| 215 | + * | |
| 216 | + * @param executor | |
| 217 | + * The thread pool for the resulting group | |
| 218 | + * @param initialSize | |
| 219 | + * A value {@code >=0} or a negative value for implementation | |
| 220 | + * specific default | |
| 221 | + * | |
| 222 | + * @return A new asynchronous channel group | |
| 223 | + * | |
| 224 | + * @throws IOException | |
| 225 | + * If an I/O error occurs | |
| 226 | + * | |
| 227 | + * @see java.util.concurrent.Executors#newCachedThreadPool | |
| 228 | + */ | |
| 229 | + public static AsynchronousChannelGroup withCachedThreadPool(ExecutorService executor, | |
| 230 | + int initialSize) | |
| 231 | + throws IOException | |
| 232 | + { | |
| 233 | + return AsynchronousChannelProvider.provider() | |
| 234 | + .openAsynchronousChannelGroup(executor, initialSize); | |
| 235 | + } | |
| 236 | + | |
| 237 | + /** | |
| 238 | + * Creates an asynchronous channel group with a given thread pool. | |
| 239 | + * | |
| 240 | + * <p> The {@code executor} parameter is an {@code ExecutorService} that | |
| 241 | + * executes tasks submitted to dispatch completion results for operations | |
| 242 | + * initiated on asynchronous channels in the group. | |
| 243 | + * | |
| 244 | + * <p> Care should be taken when configuring the executor service. It | |
| 245 | + * should support <em>direct handoff</em> or <em>unbounded queuing</em> of | |
| 246 | + * submitted tasks, and the thread that invokes the {@link | |
| 247 | + * ExecutorService#execute execute} method should never invoke the task | |
| 248 | + * directly. An implementation may mandate additional constraints. | |
| 249 | + * | |
| 250 | + * <p> The executor is intended to be used exclusively by the resulting | |
| 251 | + * asynchronous channel group. Termination of the group results in the | |
| 252 | + * orderly {@link ExecutorService#shutdown shutdown} of the executor | |
| 253 | + * service. Shutting down the executor service by other means results in | |
| 254 | + * unspecified behavior. | |
| 255 | + * | |
| 256 | + * <p> The group is created by invoking the {@link | |
| 257 | + * AsynchronousChannelProvider#openAsynchronousChannelGroup(ExecutorService,int) | |
| 258 | + * openAsynchronousChannelGroup(ExecutorService,int)} method of the system-wide | |
| 259 | + * default {@link AsynchronousChannelProvider} object with an {@code | |
| 260 | + * initialSize} of {@code 0}. | |
| 261 | + * | |
| 262 | + * @param executor | |
| 263 | + * The thread pool for the resulting group | |
| 264 | + * | |
| 265 | + * @return A new asynchronous channel group | |
| 266 | + * | |
| 267 | + * @throws IOException | |
| 268 | + * If an I/O error occurs | |
| 269 | + */ | |
| 270 | + public static AsynchronousChannelGroup withThreadPool(ExecutorService executor) | |
| 271 | + throws IOException | |
| 272 | + { | |
| 273 | + return AsynchronousChannelProvider.provider() | |
| 274 | + .openAsynchronousChannelGroup(executor, 0); | |
| 275 | + } | |
| 276 | + | |
| 277 | + /** | |
| 278 | + * Tells whether or not this asynchronous channel group is shutdown. | |
| 279 | + * | |
| 280 | + * @return {@code true} if this asynchronous channel group is shutdown or | |
| 281 | + * has been marked for shutdown. | |
| 282 | + */ | |
| 283 | + public abstract boolean isShutdown(); | |
| 284 | + | |
| 285 | + /** | |
| 286 | + * Tells whether or not this group has terminated. | |
| 287 | + * | |
| 288 | + * <p> Where this method returns {@code true}, then the associated thread | |
| 289 | + * pool has also {@link ExecutorService#isTerminated terminated}. | |
| 290 | + * | |
| 291 | + * @return {@code true} if this group has terminated | |
| 292 | + */ | |
| 293 | + public abstract boolean isTerminated(); | |
| 294 | + | |
| 295 | + /** | |
| 296 | + * Initiates an orderly shutdown of the group. | |
| 297 | + * | |
| 298 | + * <p> This method marks the group as shutdown. Further attempts to construct | |
| 299 | + * channel that binds to this group will throw {@link ShutdownChannelGroupException}. | |
| 300 | + * The group terminates when all asynchronous channels in the group are | |
| 301 | + * closed, all actively executing completion handlers have run to completion, | |
| 302 | + * and all resources have been released. This method has no effect if the | |
| 303 | + * group is already shutdown. | |
| 304 | + */ | |
| 305 | + public abstract void shutdown(); | |
| 306 | + | |
| 307 | + /** | |
| 308 | + * Shuts down the group and closes all open channels in the group. | |
| 309 | + * | |
| 310 | + * <p> In addition to the actions performed by the {@link #shutdown() shutdown} | |
| 311 | + * method, this method invokes the {@link AsynchronousChannel#close close} | |
| 312 | + * method on all open channels in the group. This method does not attempt to | |
| 313 | + * stop or interrupt threads that are executing completion handlers. The | |
| 314 | + * group terminates when all actively executing completion handlers have run | |
| 315 | + * to completion and all resources have been released. This method may be | |
| 316 | + * invoked at any time. If some other thread has already invoked it, then | |
| 317 | + * another invocation will block until the first invocation is complete, | |
| 318 | + * after which it will return without effect. | |
| 319 | + * | |
| 320 | + * @throws IOException | |
| 321 | + * If an I/O error occurs | |
| 322 | + */ | |
| 323 | + public abstract void shutdownNow() throws IOException; | |
| 324 | + | |
| 325 | + /** | |
| 326 | + * Awaits termination of the group. | |
| 327 | + | |
| 328 | + * <p> This method blocks until the group has terminated, or the timeout | |
| 329 | + * occurs, or the current thread is interrupted, whichever happens first. | |
| 330 | + * | |
| 331 | + * @param timeout | |
| 332 | + * The maximum time to wait, or zero or less to not wait | |
| 333 | + * @param unit | |
| 334 | + * The time unit of the timeout argument | |
| 335 | + * | |
| 336 | + * @return {@code true} if the group has terminated; {@code false} if the | |
| 337 | + * timeout elapsed before termination | |
| 338 | + * | |
| 339 | + * @throws InterruptedException | |
| 340 | + * If interrupted while waiting | |
| 341 | + */ | |
| 342 | + public abstract boolean awaitTermination(long timeout, TimeUnit unit) | |
| 343 | + throws InterruptedException; | |
| 344 | +} | |
Binary file not shown.
| @@ -0,0 +1,770 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2011, 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.nio.file.*; | |
| 29 | +import java.nio.file.attribute.FileAttribute; | |
| 30 | +import java.nio.file.spi.*; | |
| 31 | +import java.nio.ByteBuffer; | |
| 32 | +import java.io.IOException; | |
| 33 | +import java.util.concurrent.Future; | |
| 34 | +import java.util.concurrent.ExecutorService; | |
| 35 | +import java.util.Set; | |
| 36 | +import java.util.HashSet; | |
| 37 | +import java.util.Collections; | |
| 38 | + | |
| 39 | +/** | |
| 40 | + * An asynchronous channel for reading, writing, and manipulating a file. | |
| 41 | + * | |
| 42 | + * <p> An asynchronous file channel is created when a file is opened by invoking | |
| 43 | + * one of the {@link #open open} methods defined by this class. The file contains | |
| 44 | + * a variable-length sequence of bytes that can be read and written and whose | |
| 45 | + * current size can be {@link #size() queried}. The size of the file increases | |
| 46 | + * when bytes are written beyond its current size; the size of the file decreases | |
| 47 | + * when it is {@link #truncate truncated}. | |
| 48 | + * | |
| 49 | + * <p> An asynchronous file channel does not have a <i>current position</i> | |
| 50 | + * within the file. Instead, the file position is specified to each read and | |
| 51 | + * write method that initiates asynchronous operations. A {@link CompletionHandler} | |
| 52 | + * is specified as a parameter and is invoked to consume the result of the I/O | |
| 53 | + * operation. This class also defines read and write methods that initiate | |
| 54 | + * asynchronous operations, returning a {@link Future} to represent the pending | |
| 55 | + * result of the operation. The {@code Future} may be used to check if the | |
| 56 | + * operation has completed, wait for its completion, and retrieve the result. | |
| 57 | + * | |
| 58 | + * <p> In addition to read and write operations, this class defines the | |
| 59 | + * following operations: </p> | |
| 60 | + * | |
| 61 | + * <ul> | |
| 62 | + * | |
| 63 | + * <li><p> Updates made to a file may be {@link #force <i>forced | |
| 64 | + * out</i>} to the underlying storage device, ensuring that data are not | |
| 65 | + * lost in the event of a system crash. </p></li> | |
| 66 | + * | |
| 67 | + * <li><p> A region of a file may be {@link #lock <i>locked</i>} against | |
| 68 | + * access by other programs. </p></li> | |
| 69 | + * | |
| 70 | + * </ul> | |
| 71 | + * | |
| 72 | + * <p> An {@code AsynchronousFileChannel} is associated with a thread pool to | |
| 73 | + * which tasks are submitted to handle I/O events and dispatch to completion | |
| 74 | + * handlers that consume the results of I/O operations on the channel. The | |
| 75 | + * completion handler for an I/O operation initiated on a channel is guaranteed | |
| 76 | + * to be invoked by one of the threads in the thread pool (This ensures that the | |
| 77 | + * completion handler is run by a thread with the expected <em>identity</em>). | |
| 78 | + * Where an I/O operation completes immediately, and the initiating thread is | |
| 79 | + * itself a thread in the thread pool, then the completion handler may be invoked | |
| 80 | + * directly by the initiating thread. When an {@code AsynchronousFileChannel} is | |
| 81 | + * created without specifying a thread pool then the channel is associated with | |
| 82 | + * a system-dependent default thread pool that may be shared with other | |
| 83 | + * channels. The default thread pool is configured by the system properties | |
| 84 | + * defined by the {@link AsynchronousChannelGroup} class. | |
| 85 | + * | |
| 86 | + * <p> Channels of this type are safe for use by multiple concurrent threads. The | |
| 87 | + * {@link Channel#close close} method may be invoked at any time, as specified | |
| 88 | + * by the {@link Channel} interface. This causes all outstanding asynchronous | |
| 89 | + * operations on the channel to complete with the exception {@link | |
| 90 | + * AsynchronousCloseException}. Multiple read and write operations may be | |
| 91 | + * outstanding at the same time. When multiple read and write operations are | |
| 92 | + * outstanding then the ordering of the I/O operations, and the order that the | |
| 93 | + * completion handlers are invoked, is not specified; they are not, in particular, | |
| 94 | + * guaranteed to execute in the order that the operations were initiated. The | |
| 95 | + * {@link java.nio.ByteBuffer ByteBuffers} used when reading or writing are not | |
| 96 | + * safe for use by multiple concurrent I/O operations. Furthermore, after an I/O | |
| 97 | + * operation is initiated then care should be taken to ensure that the buffer is | |
| 98 | + * not accessed until after the operation has completed. | |
| 99 | + * | |
| 100 | + * <p> As with {@link FileChannel}, the view of a file provided by an instance of | |
| 101 | + * this class is guaranteed to be consistent with other views of the same file | |
| 102 | + * provided by other instances in the same program. The view provided by an | |
| 103 | + * instance of this class may or may not, however, be consistent with the views | |
| 104 | + * seen by other concurrently-running programs due to caching performed by the | |
| 105 | + * underlying operating system and delays induced by network-filesystem protocols. | |
| 106 | + * This is true regardless of the language in which these other programs are | |
| 107 | + * written, and whether they are running on the same machine or on some other | |
| 108 | + * machine. The exact nature of any such inconsistencies are system-dependent | |
| 109 | + * and are therefore unspecified. | |
| 110 | + * | |
| 111 | + * @since 1.7 | |
| 112 | + */ | |
| 113 | + | |
| 114 | +public abstract class AsynchronousFileChannel | |
| 115 | + implements AsynchronousChannel | |
| 116 | +{ | |
| 117 | + /** | |
| 118 | + * Initializes a new instance of this class. | |
| 119 | + */ | |
| 120 | + protected AsynchronousFileChannel() { | |
| 121 | + } | |
| 122 | + | |
| 123 | + /** | |
| 124 | + * Opens or creates a file for reading and/or writing, returning an | |
| 125 | + * asynchronous file channel to access the file. | |
| 126 | + * | |
| 127 | + * <p> The {@code options} parameter determines how the file is opened. | |
| 128 | + * The {@link StandardOpenOption#READ READ} and {@link StandardOpenOption#WRITE | |
| 129 | + * WRITE} options determines if the file should be opened for reading and/or | |
| 130 | + * writing. If neither option is contained in the array then an existing file | |
| 131 | + * is opened for reading. | |
| 132 | + * | |
| 133 | + * <p> In addition to {@code READ} and {@code WRITE}, the following options | |
| 134 | + * may be present: | |
| 135 | + * | |
| 136 | + * <table border=1 cellpadding=5 summary=""> | |
| 137 | + * <tr> <th>Option</th> <th>Description</th> </tr> | |
| 138 | + * <tr> | |
| 139 | + * <td> {@link StandardOpenOption#TRUNCATE_EXISTING TRUNCATE_EXISTING} </td> | |
| 140 | + * <td> When opening an existing file, the file is first truncated to a | |
| 141 | + * size of 0 bytes. This option is ignored when the file is opened only | |
| 142 | + * for reading.</td> | |
| 143 | + * </tr> | |
| 144 | + * <tr> | |
| 145 | + * <td> {@link StandardOpenOption#CREATE_NEW CREATE_NEW} </td> | |
| 146 | + * <td> If this option is present then a new file is created, failing if | |
| 147 | + * the file already exists. When creating a file the check for the | |
| 148 | + * existence of the file and the creation of the file if it does not exist | |
| 149 | + * is atomic with respect to other file system operations. This option is | |
| 150 | + * ignored when the file is opened only for reading. </td> | |
| 151 | + * </tr> | |
| 152 | + * <tr> | |
| 153 | + * <td > {@link StandardOpenOption#CREATE CREATE} </td> | |
| 154 | + * <td> If this option is present then an existing file is opened if it | |
| 155 | + * exists, otherwise a new file is created. When creating a file the check | |
| 156 | + * for the existence of the file and the creation of the file if it does | |
| 157 | + * not exist is atomic with respect to other file system operations. This | |
| 158 | + * option is ignored if the {@code CREATE_NEW} option is also present or | |
| 159 | + * the file is opened only for reading. </td> | |
| 160 | + * </tr> | |
| 161 | + * <tr> | |
| 162 | + * <td > {@link StandardOpenOption#DELETE_ON_CLOSE DELETE_ON_CLOSE} </td> | |
| 163 | + * <td> When this option is present then the implementation makes a | |
| 164 | + * <em>best effort</em> attempt to delete the file when closed by the | |
| 165 | + * the {@link #close close} method. If the {@code close} method is not | |
| 166 | + * invoked then a <em>best effort</em> attempt is made to delete the file | |
| 167 | + * when the Java virtual machine terminates. </td> | |
| 168 | + * </tr> | |
| 169 | + * <tr> | |
| 170 | + * <td>{@link StandardOpenOption#SPARSE SPARSE} </td> | |
| 171 | + * <td> When creating a new file this option is a <em>hint</em> that the | |
| 172 | + * new file will be sparse. This option is ignored when not creating | |
| 173 | + * a new file. </td> | |
| 174 | + * </tr> | |
| 175 | + * <tr> | |
| 176 | + * <td> {@link StandardOpenOption#SYNC SYNC} </td> | |
| 177 | + * <td> Requires that every update to the file's content or metadata be | |
| 178 | + * written synchronously to the underlying storage device. (see <a | |
| 179 | + * href="../file/package-summary.html#integrity"> Synchronized I/O file | |
| 180 | + * integrity</a>). </td> | |
| 181 | + * <tr> | |
| 182 | + * <tr> | |
| 183 | + * <td> {@link StandardOpenOption#DSYNC DSYNC} </td> | |
| 184 | + * <td> Requires that every update to the file's content be written | |
| 185 | + * synchronously to the underlying storage device. (see <a | |
| 186 | + * href="../file/package-summary.html#integrity"> Synchronized I/O file | |
| 187 | + * integrity</a>). </td> | |
| 188 | + * </tr> | |
| 189 | + * </table> | |
| 190 | + * | |
| 191 | + * <p> An implementation may also support additional options. | |
| 192 | + * | |
| 193 | + * <p> The {@code executor} parameter is the {@link ExecutorService} to | |
| 194 | + * which tasks are submitted to handle I/O events and dispatch completion | |
| 195 | + * results for operations initiated on resulting channel. | |
| 196 | + * The nature of these tasks is highly implementation specific and so care | |
| 197 | + * should be taken when configuring the {@code Executor}. Minimally it | |
| 198 | + * should support an unbounded work queue and should not run tasks on the | |
| 199 | + * caller thread of the {@link ExecutorService#execute execute} method. | |
| 200 | + * Shutting down the executor service while the channel is open results in | |
| 201 | + * unspecified behavior. | |
| 202 | + * | |
| 203 | + * <p> The {@code attrs} parameter is an optional array of file {@link | |
| 204 | + * FileAttribute file-attributes} to set atomically when creating the file. | |
| 205 | + * | |
| 206 | + * <p> The new channel is created by invoking the {@link | |
| 207 | + * FileSystemProvider#newFileChannel newFileChannel} method on the | |
| 208 | + * provider that created the {@code Path}. | |
| 209 | + * | |
| 210 | + * @param file | |
| 211 | + * The path of the file to open or create | |
| 212 | + * @param options | |
| 213 | + * Options specifying how the file is opened | |
| 214 | + * @param executor | |
| 215 | + * The thread pool or {@code null} to associate the channel with | |
| 216 | + * the default thread pool | |
| 217 | + * @param attrs | |
| 218 | + * An optional list of file attributes to set atomically when | |
| 219 | + * creating the file | |
| 220 | + * | |
| 221 | + * @return A new asynchronous file channel | |
| 222 | + * | |
| 223 | + * @throws IllegalArgumentException | |
| 224 | + * If the set contains an invalid combination of options | |
| 225 | + * @throws UnsupportedOperationException | |
| 226 | + * If the {@code file} is associated with a provider that does not | |
| 227 | + * support creating asynchronous file channels, or an unsupported | |
| 228 | + * open option is specified, or the array contains an attribute that | |
| 229 | + * cannot be set atomically when creating the file | |
| 230 | + * @throws IOException | |
| 231 | + * If an I/O error occurs | |
| 232 | + * @throws SecurityException | |
| 233 | + * If a security manager is installed and it denies an | |
| 234 | + * unspecified permission required by the implementation. | |
| 235 | + * In the case of the default provider, the {@link | |
| 236 | + * SecurityManager#checkRead(String)} method is invoked to check | |
| 237 | + * read access if the file is opened for reading. The {@link | |
| 238 | + * SecurityManager#checkWrite(String)} method is invoked to check | |
| 239 | + * write access if the file is opened for writing | |
| 240 | + */ | |
| 241 | + public static AsynchronousFileChannel open(Path file, | |
| 242 | + Set<? extends OpenOption> options, | |
| 243 | + ExecutorService executor, | |
| 244 | + FileAttribute<?>... attrs) | |
| 245 | + throws IOException | |
| 246 | + { | |
| 247 | + FileSystemProvider provider = file.getFileSystem().provider(); | |
| 248 | + return provider.newAsynchronousFileChannel(file, options, executor, attrs); | |
| 249 | + } | |
| 250 | + | |
| 251 | + private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0]; | |
| 252 | + | |
| 253 | + /** | |
| 254 | + * Opens or creates a file for reading and/or writing, returning an | |
| 255 | + * asynchronous file channel to access the file. | |
| 256 | + * | |
| 257 | + * <p> An invocation of this method behaves in exactly the same way as the | |
| 258 | + * invocation | |
| 259 | + * <pre> | |
| 260 | + * ch.{@link #open(Path,Set,ExecutorService,FileAttribute[]) | |
| 261 | + * open}(file, opts, null, new FileAttribute<?>[0]); | |
| 262 | + * </pre> | |
| 263 | + * where {@code opts} is a {@code Set} containing the options specified to | |
| 264 | + * this method. | |
| 265 | + * | |
| 266 | + * <p> The resulting channel is associated with default thread pool to which | |
| 267 | + * tasks are submitted to handle I/O events and dispatch to completion | |
| 268 | + * handlers that consume the result of asynchronous operations performed on | |
| 269 | + * the resulting channel. | |
| 270 | + * | |
| 271 | + * @param file | |
| 272 | + * The path of the file to open or create | |
| 273 | + * @param options | |
| 274 | + * Options specifying how the file is opened | |
| 275 | + * | |
| 276 | + * @return A new asynchronous file channel | |
| 277 | + * | |
| 278 | + * @throws IllegalArgumentException | |
| 279 | + * If the set contains an invalid combination of options | |
| 280 | + * @throws UnsupportedOperationException | |
| 281 | + * If the {@code file} is associated with a provider that does not | |
| 282 | + * support creating file channels, or an unsupported open option is | |
| 283 | + * specified | |
| 284 | + * @throws IOException | |
| 285 | + * If an I/O error occurs | |
| 286 | + * @throws SecurityException | |
| 287 | + * If a security manager is installed and it denies an | |
| 288 | + * unspecified permission required by the implementation. | |
| 289 | + * In the case of the default provider, the {@link | |
| 290 | + * SecurityManager#checkRead(String)} method is invoked to check | |
| 291 | + * read access if the file is opened for reading. The {@link | |
| 292 | + * SecurityManager#checkWrite(String)} method is invoked to check | |
| 293 | + * write access if the file is opened for writing | |
| 294 | + */ | |
| 295 | + public static AsynchronousFileChannel open(Path file, OpenOption... options) | |
| 296 | + throws IOException | |
| 297 | + { | |
| 298 | + Set<OpenOption> set = new HashSet<OpenOption>(options.length); | |
| 299 | + Collections.addAll(set, options); | |
| 300 | + return open(file, set, null, NO_ATTRIBUTES); | |
| 301 | + } | |
| 302 | + | |
| 303 | + /** | |
| 304 | + * Returns the current size of this channel's file. | |
| 305 | + * | |
| 306 | + * @return The current size of this channel's file, measured in bytes | |
| 307 | + * | |
| 308 | + * @throws ClosedChannelException | |
| 309 | + * If this channel is closed | |
| 310 | + * @throws IOException | |
| 311 | + * If some other I/O error occurs | |
| 312 | + */ | |
| 313 | + public abstract long size() throws IOException; | |
| 314 | + | |
| 315 | + /** | |
| 316 | + * Truncates this channel's file to the given size. | |
| 317 | + * | |
| 318 | + * <p> If the given size is less than the file's current size then the file | |
| 319 | + * is truncated, discarding any bytes beyond the new end of the file. If | |
| 320 | + * the given size is greater than or equal to the file's current size then | |
| 321 | + * the file is not modified. </p> | |
| 322 | + * | |
| 323 | + * @param size | |
| 324 | + * The new size, a non-negative byte count | |
| 325 | + * | |
| 326 | + * @return This file channel | |
| 327 | + * | |
| 328 | + * @throws NonWritableChannelException | |
| 329 | + * If this channel was not opened for writing | |
| 330 | + * | |
| 331 | + * @throws ClosedChannelException | |
| 332 | + * If this channel is closed | |
| 333 | + * | |
| 334 | + * @throws IllegalArgumentException | |
| 335 | + * If the new size is negative | |
| 336 | + * | |
| 337 | + * @throws IOException | |
| 338 | + * If some other I/O error occurs | |
| 339 | + */ | |
| 340 | + public abstract AsynchronousFileChannel truncate(long size) throws IOException; | |
| 341 | + | |
| 342 | + /** | |
| 343 | + * Forces any updates to this channel's file to be written to the storage | |
| 344 | + * device that contains it. | |
| 345 | + * | |
| 346 | + * <p> If this channel's file resides on a local storage device then when | |
| 347 | + * this method returns it is guaranteed that all changes made to the file | |
| 348 | + * since this channel was created, or since this method was last invoked, | |
| 349 | + * will have been written to that device. This is useful for ensuring that | |
| 350 | + * critical information is not lost in the event of a system crash. | |
| 351 | + * | |
| 352 | + * <p> If the file does not reside on a local device then no such guarantee | |
| 353 | + * is made. | |
| 354 | + * | |
| 355 | + * <p> The {@code metaData} parameter can be used to limit the number of | |
| 356 | + * I/O operations that this method is required to perform. Passing | |
| 357 | + * {@code false} for this parameter indicates that only updates to the | |
| 358 | + * file's content need be written to storage; passing {@code true} | |
| 359 | + * indicates that updates to both the file's content and metadata must be | |
| 360 | + * written, which generally requires at least one more I/O operation. | |
| 361 | + * Whether this parameter actually has any effect is dependent upon the | |
| 362 | + * underlying operating system and is therefore unspecified. | |
| 363 | + * | |
| 364 | + * <p> Invoking this method may cause an I/O operation to occur even if the | |
| 365 | + * channel was only opened for reading. Some operating systems, for | |
| 366 | + * example, maintain a last-access time as part of a file's metadata, and | |
| 367 | + * this time is updated whenever the file is read. Whether or not this is | |
| 368 | + * actually done is system-dependent and is therefore unspecified. | |
| 369 | + * | |
| 370 | + * <p> This method is only guaranteed to force changes that were made to | |
| 371 | + * this channel's file via the methods defined in this class. | |
| 372 | + * | |
| 373 | + * @param metaData | |
| 374 | + * If {@code true} then this method is required to force changes | |
| 375 | + * to both the file's content and metadata to be written to | |
| 376 | + * storage; otherwise, it need only force content changes to be | |
| 377 | + * written | |
| 378 | + * | |
| 379 | + * @throws ClosedChannelException | |
| 380 | + * If this channel is closed | |
| 381 | + * | |
| 382 | + * @throws IOException | |
| 383 | + * If some other I/O error occurs | |
| 384 | + */ | |
| 385 | + public abstract void force(boolean metaData) throws IOException; | |
| 386 | + | |
| 387 | + /** | |
| 388 | + * Acquires a lock on the given region of this channel's file. | |
| 389 | + * | |
| 390 | + * <p> This method initiates an operation to acquire a lock on the given | |
| 391 | + * region of this channel's file. The {@code handler} parameter is a | |
| 392 | + * completion handler that is invoked when the lock is acquired (or the | |
| 393 | + * operation fails). The result passed to the completion handler is the | |
| 394 | + * resulting {@code FileLock}. | |
| 395 | + * | |
| 396 | + * <p> The region specified by the {@code position} and {@code size} | |
| 397 | + * parameters need not be contained within, or even overlap, the actual | |
| 398 | + * underlying file. Lock regions are fixed in size; if a locked region | |
| 399 | + * initially contains the end of the file and the file grows beyond the | |
| 400 | + * region then the new portion of the file will not be covered by the lock. | |
| 401 | + * If a file is expected to grow in size and a lock on the entire file is | |
| 402 | + * required then a region starting at zero, and no smaller than the | |
| 403 | + * expected maximum size of the file, should be locked. The two-argument | |
| 404 | + * {@link #lock(Object,CompletionHandler)} method simply locks a region | |
| 405 | + * of size {@link Long#MAX_VALUE}. If a lock that overlaps the requested | |
| 406 | + * region is already held by this Java virtual machine, or this method has | |
| 407 | + * been invoked to lock an overlapping region and that operation has not | |
| 408 | + * completed, then this method throws {@link OverlappingFileLockException}. | |
| 409 | + * | |
| 410 | + * <p> Some operating systems do not support a mechanism to acquire a file | |
| 411 | + * lock in an asynchronous manner. Consequently an implementation may | |
| 412 | + * acquire the file lock in a background thread or from a task executed by | |
| 413 | + * a thread in the associated thread pool. If there are many lock operations | |
| 414 | + * outstanding then it may consume threads in the Java virtual machine for | |
| 415 | + * indefinite periods. | |
| 416 | + * | |
| 417 | + * <p> Some operating systems do not support shared locks, in which case a | |
| 418 | + * request for a shared lock is automatically converted into a request for | |
| 419 | + * an exclusive lock. Whether the newly-acquired lock is shared or | |
| 420 | + * exclusive may be tested by invoking the resulting lock object's {@link | |
| 421 | + * FileLock#isShared() isShared} method. | |
| 422 | + * | |
| 423 | + * <p> File locks are held on behalf of the entire Java virtual machine. | |
| 424 | + * They are not suitable for controlling access to a file by multiple | |
| 425 | + * threads within the same virtual machine. | |
| 426 | + * | |
| 427 | + * @param position | |
| 428 | + * The position at which the locked region is to start; must be | |
| 429 | + * non-negative | |
| 430 | + * @param size | |
| 431 | + * The size of the locked region; must be non-negative, and the sum | |
| 432 | + * {@code position} + {@code size} must be non-negative | |
| 433 | + * @param shared | |
| 434 | + * {@code true} to request a shared lock, in which case this | |
| 435 | + * channel must be open for reading (and possibly writing); | |
| 436 | + * {@code false} to request an exclusive lock, in which case this | |
| 437 | + * channel must be open for writing (and possibly reading) | |
| 438 | + * @param attachment | |
| 439 | + * The object to attach to the I/O operation; can be {@code null} | |
| 440 | + * @param handler | |
| 441 | + * The handler for consuming the result | |
| 442 | + * | |
| 443 | + * @throws OverlappingFileLockException | |
| 444 | + * If a lock that overlaps the requested region is already held by | |
| 445 | + * this Java virtual machine, or there is already a pending attempt | |
| 446 | + * to lock an overlapping region | |
| 447 | + * @throws IllegalArgumentException | |
| 448 | + * If the preconditions on the parameters do not hold | |
| 449 | + * @throws NonReadableChannelException | |
| 450 | + * If {@code shared} is true but this channel was not opened for reading | |
| 451 | + * @throws NonWritableChannelException | |
| 452 | + * If {@code shared} is false but this channel was not opened for writing | |
| 453 | + */ | |
| 454 | + public abstract <A> void lock(long position, | |
| 455 | + long size, | |
| 456 | + boolean shared, | |
| 457 | + A attachment, | |
| 458 | + CompletionHandler<FileLock,? super A> handler); | |
| 459 | + | |
| 460 | + /** | |
| 461 | + * Acquires an exclusive lock on this channel's file. | |
| 462 | + * | |
| 463 | + * <p> This method initiates an operation to acquire a lock on the given | |
| 464 | + * region of this channel's file. The {@code handler} parameter is a | |
| 465 | + * completion handler that is invoked when the lock is acquired (or the | |
| 466 | + * operation fails). The result passed to the completion handler is the | |
| 467 | + * resulting {@code FileLock}. | |
| 468 | + * | |
| 469 | + * <p> An invocation of this method of the form {@code ch.lock(att,handler)} | |
| 470 | + * behaves in exactly the same way as the invocation | |
| 471 | + * <pre> | |
| 472 | + * ch.{@link #lock(long,long,boolean,Object,CompletionHandler) lock}(0L, Long.MAX_VALUE, false, att, handler) | |
| 473 | + * </pre> | |
| 474 | + * | |
| 475 | + * @param attachment | |
| 476 | + * The object to attach to the I/O operation; can be {@code null} | |
| 477 | + * @param handler | |
| 478 | + * The handler for consuming the result | |
| 479 | + * | |
| 480 | + * @throws OverlappingFileLockException | |
| 481 | + * If a lock is already held by this Java virtual machine, or there | |
| 482 | + * is already a pending attempt to lock a region | |
| 483 | + * @throws NonWritableChannelException | |
| 484 | + * If this channel was not opened for writing | |
| 485 | + */ | |
| 486 | + public final <A> void lock(A attachment, | |
| 487 | + CompletionHandler<FileLock,? super A> handler) | |
| 488 | + { | |
| 489 | + lock(0L, Long.MAX_VALUE, false, attachment, handler); | |
| 490 | + } | |
| 491 | + | |
| 492 | + /** | |
| 493 | + * Acquires a lock on the given region of this channel's file. | |
| 494 | + * | |
| 495 | + * <p> This method initiates an operation to acquire a lock on the given | |
| 496 | + * region of this channel's file. The method behaves in exactly the same | |
| 497 | + * manner as the {@link #lock(long, long, boolean, Object, CompletionHandler)} | |
| 498 | + * method except that instead of specifying a completion handler, this | |
| 499 | + * method returns a {@code Future} representing the pending result. The | |
| 500 | + * {@code Future}'s {@link Future#get() get} method returns the {@link | |
| 501 | + * FileLock} on successful completion. | |
| 502 | + * | |
| 503 | + * @param position | |
| 504 | + * The position at which the locked region is to start; must be | |
| 505 | + * non-negative | |
| 506 | + * @param size | |
| 507 | + * The size of the locked region; must be non-negative, and the sum | |
| 508 | + * {@code position} + {@code size} must be non-negative | |
| 509 | + * @param shared | |
| 510 | + * {@code true} to request a shared lock, in which case this | |
| 511 | + * channel must be open for reading (and possibly writing); | |
| 512 | + * {@code false} to request an exclusive lock, in which case this | |
| 513 | + * channel must be open for writing (and possibly reading) | |
| 514 | + * | |
| 515 | + * @return a {@code Future} object representing the pending result | |
| 516 | + * | |
| 517 | + * @throws OverlappingFileLockException | |
| 518 | + * If a lock is already held by this Java virtual machine, or there | |
| 519 | + * is already a pending attempt to lock a region | |
| 520 | + * @throws IllegalArgumentException | |
| 521 | + * If the preconditions on the parameters do not hold | |
| 522 | + * @throws NonReadableChannelException | |
| 523 | + * If {@code shared} is true but this channel was not opened for reading | |
| 524 | + * @throws NonWritableChannelException | |
| 525 | + * If {@code shared} is false but this channel was not opened for writing | |
| 526 | + */ | |
| 527 | + public abstract Future<FileLock> lock(long position, long size, boolean shared); | |
| 528 | + | |
| 529 | + /** | |
| 530 | + * Acquires an exclusive lock on this channel's file. | |
| 531 | + * | |
| 532 | + * <p> This method initiates an operation to acquire an exclusive lock on this | |
| 533 | + * channel's file. The method returns a {@code Future} representing the | |
| 534 | + * pending result of the operation. The {@code Future}'s {@link Future#get() | |
| 535 | + * get} method returns the {@link FileLock} on successful completion. | |
| 536 | + * | |
| 537 | + * <p> An invocation of this method behaves in exactly the same way as the | |
| 538 | + * invocation | |
| 539 | + * <pre> | |
| 540 | + * ch.{@link #lock(long,long,boolean) lock}(0L, Long.MAX_VALUE, false) | |
| 541 | + * </pre> | |
| 542 | + * | |
| 543 | + * @return a {@code Future} object representing the pending result | |
| 544 | + * | |
| 545 | + * @throws OverlappingFileLockException | |
| 546 | + * If a lock is already held by this Java virtual machine, or there | |
| 547 | + * is already a pending attempt to lock a region | |
| 548 | + * @throws NonWritableChannelException | |
| 549 | + * If this channel was not opened for writing | |
| 550 | + */ | |
| 551 | + public final Future<FileLock> lock() { | |
| 552 | + return lock(0L, Long.MAX_VALUE, false); | |
| 553 | + } | |
| 554 | + | |
| 555 | + /** | |
| 556 | + * Attempts to acquire a lock on the given region of this channel's file. | |
| 557 | + * | |
| 558 | + * <p> This method does not block. An invocation always returns immediately, | |
| 559 | + * either having acquired a lock on the requested region or having failed to | |
| 560 | + * do so. If it fails to acquire a lock because an overlapping lock is held | |
| 561 | + * by another program then it returns {@code null}. If it fails to acquire | |
| 562 | + * a lock for any other reason then an appropriate exception is thrown. | |
| 563 | + * | |
| 564 | + * @param position | |
| 565 | + * The position at which the locked region is to start; must be | |
| 566 | + * non-negative | |
| 567 | + * | |
| 568 | + * @param size | |
| 569 | + * The size of the locked region; must be non-negative, and the sum | |
| 570 | + * {@code position} + {@code size} must be non-negative | |
| 571 | + * | |
| 572 | + * @param shared | |
| 573 | + * {@code true} to request a shared lock, | |
| 574 | + * {@code false} to request an exclusive lock | |
| 575 | + * | |
| 576 | + * @return A lock object representing the newly-acquired lock, | |
| 577 | + * or {@code null} if the lock could not be acquired | |
| 578 | + * because another program holds an overlapping lock | |
| 579 | + * | |
| 580 | + * @throws IllegalArgumentException | |
| 581 | + * If the preconditions on the parameters do not hold | |
| 582 | + * @throws ClosedChannelException | |
| 583 | + * If this channel is closed | |
| 584 | + * @throws OverlappingFileLockException | |
| 585 | + * If a lock that overlaps the requested region is already held by | |
| 586 | + * this Java virtual machine, or if another thread is already | |
| 587 | + * blocked in this method and is attempting to lock an overlapping | |
| 588 | + * region of the same file | |
| 589 | + * @throws NonReadableChannelException | |
| 590 | + * If {@code shared} is true but this channel was not opened for reading | |
| 591 | + * @throws NonWritableChannelException | |
| 592 | + * If {@code shared} is false but this channel was not opened for writing | |
| 593 | + * | |
| 594 | + * @throws IOException | |
| 595 | + * If some other I/O error occurs | |
| 596 | + * | |
| 597 | + * @see #lock(Object,CompletionHandler) | |
| 598 | + * @see #lock(long,long,boolean,Object,CompletionHandler) | |
| 599 | + * @see #tryLock() | |
| 600 | + */ | |
| 601 | + public abstract FileLock tryLock(long position, long size, boolean shared) | |
| 602 | + throws IOException; | |
| 603 | + | |
| 604 | + /** | |
| 605 | + * Attempts to acquire an exclusive lock on this channel's file. | |
| 606 | + * | |
| 607 | + * <p> An invocation of this method of the form {@code ch.tryLock()} | |
| 608 | + * behaves in exactly the same way as the invocation | |
| 609 | + * | |
| 610 | + * <pre> | |
| 611 | + * ch.{@link #tryLock(long,long,boolean) tryLock}(0L, Long.MAX_VALUE, false) </pre> | |
| 612 | + * | |
| 613 | + * @return A lock object representing the newly-acquired lock, | |
| 614 | + * or {@code null} if the lock could not be acquired | |
| 615 | + * because another program holds an overlapping lock | |
| 616 | + * | |
| 617 | + * @throws ClosedChannelException | |
| 618 | + * If this channel is closed | |
| 619 | + * @throws OverlappingFileLockException | |
| 620 | + * If a lock that overlaps the requested region is already held by | |
| 621 | + * this Java virtual machine, or if another thread is already | |
| 622 | + * blocked in this method and is attempting to lock an overlapping | |
| 623 | + * region | |
| 624 | + * @throws NonWritableChannelException | |
| 625 | + * If {@code shared} is false but this channel was not opened for writing | |
| 626 | + * | |
| 627 | + * @throws IOException | |
| 628 | + * If some other I/O error occurs | |
| 629 | + * | |
| 630 | + * @see #lock(Object,CompletionHandler) | |
| 631 | + * @see #lock(long,long,boolean,Object,CompletionHandler) | |
| 632 | + * @see #tryLock(long,long,boolean) | |
| 633 | + */ | |
| 634 | + public final FileLock tryLock() throws IOException { | |
| 635 | + return tryLock(0L, Long.MAX_VALUE, false); | |
| 636 | + } | |
| 637 | + | |
| 638 | + /** | |
| 639 | + * Reads a sequence of bytes from this channel into the given buffer, | |
| 640 | + * starting at the given file position. | |
| 641 | + * | |
| 642 | + * <p> This method initiates the reading of a sequence of bytes from this | |
| 643 | + * channel into the given buffer, starting at the given file position. The | |
| 644 | + * result of the read is the number of bytes read or {@code -1} if the given | |
| 645 | + * position is greater than or equal to the file's size at the time that the | |
| 646 | + * read is attempted. | |
| 647 | + * | |
| 648 | + * <p> This method works in the same manner as the {@link | |
| 649 | + * AsynchronousByteChannel#read(ByteBuffer,Object,CompletionHandler)} | |
| 650 | + * method, except that bytes are read starting at the given file position. | |
| 651 | + * If the given file position is greater than the file's size at the time | |
| 652 | + * that the read is attempted then no bytes are read. | |
| 653 | + * | |
| 654 | + * @param dst | |
| 655 | + * The buffer into which bytes are to be transferred | |
| 656 | + * @param position | |
| 657 | + * The file position at which the transfer is to begin; | |
| 658 | + * must be non-negative | |
| 659 | + * @param attachment | |
| 660 | + * The object to attach to the I/O operation; can be {@code null} | |
| 661 | + * @param handler | |
| 662 | + * The handler for consuming the result | |
| 663 | + * | |
| 664 | + * @throws IllegalArgumentException | |
| 665 | + * If the position is negative or the buffer is read-only | |
| 666 | + * @throws NonReadableChannelException | |
| 667 | + * If this channel was not opened for reading | |
| 668 | + */ | |
| 669 | + public abstract <A> void read(ByteBuffer dst, | |
| 670 | + long position, | |
| 671 | + A attachment, | |
| 672 | + CompletionHandler<Integer,? super A> handler); | |
| 673 | + | |
| 674 | + /** | |
| 675 | + * Reads a sequence of bytes from this channel into the given buffer, | |
| 676 | + * starting at the given file position. | |
| 677 | + * | |
| 678 | + * <p> This method initiates the reading of a sequence of bytes from this | |
| 679 | + * channel into the given buffer, starting at the given file position. This | |
| 680 | + * method returns a {@code Future} representing the pending result of the | |
| 681 | + * operation. The {@code Future}'s {@link Future#get() get} method returns | |
| 682 | + * the number of bytes read or {@code -1} if the given position is greater | |
| 683 | + * than or equal to the file's size at the time that the read is attempted. | |
| 684 | + * | |
| 685 | + * <p> This method works in the same manner as the {@link | |
| 686 | + * AsynchronousByteChannel#read(ByteBuffer)} method, except that bytes are | |
| 687 | + * read starting at the given file position. If the given file position is | |
| 688 | + * greater than the file's size at the time that the read is attempted then | |
| 689 | + * no bytes are read. | |
| 690 | + * | |
| 691 | + * @param dst | |
| 692 | + * The buffer into which bytes are to be transferred | |
| 693 | + * @param position | |
| 694 | + * The file position at which the transfer is to begin; | |
| 695 | + * must be non-negative | |
| 696 | + * | |
| 697 | + * @return A {@code Future} object representing the pending result | |
| 698 | + * | |
| 699 | + * @throws IllegalArgumentException | |
| 700 | + * If the position is negative or the buffer is read-only | |
| 701 | + * @throws NonReadableChannelException | |
| 702 | + * If this channel was not opened for reading | |
| 703 | + */ | |
| 704 | + public abstract Future<Integer> read(ByteBuffer dst, long position); | |
| 705 | + | |
| 706 | + /** | |
| 707 | + * Writes a sequence of bytes to this channel from the given buffer, starting | |
| 708 | + * at the given file position. | |
| 709 | + * | |
| 710 | + * <p> This method works in the same manner as the {@link | |
| 711 | + * AsynchronousByteChannel#write(ByteBuffer,Object,CompletionHandler)} | |
| 712 | + * method, except that bytes are written starting at the given file position. | |
| 713 | + * If the given position is greater than the file's size, at the time that | |
| 714 | + * the write is attempted, then the file will be grown to accommodate the new | |
| 715 | + * bytes; the values of any bytes between the previous end-of-file and the | |
| 716 | + * newly-written bytes are unspecified. | |
| 717 | + * | |
| 718 | + * @param src | |
| 719 | + * The buffer from which bytes are to be transferred | |
| 720 | + * @param position | |
| 721 | + * The file position at which the transfer is to begin; | |
| 722 | + * must be non-negative | |
| 723 | + * @param attachment | |
| 724 | + * The object to attach to the I/O operation; can be {@code null} | |
| 725 | + * @param handler | |
| 726 | + * The handler for consuming the result | |
| 727 | + * | |
| 728 | + * @throws IllegalArgumentException | |
| 729 | + * If the position is negative | |
| 730 | + * @throws NonWritableChannelException | |
| 731 | + * If this channel was not opened for writing | |
| 732 | + */ | |
| 733 | + public abstract <A> void write(ByteBuffer src, | |
| 734 | + long position, | |
| 735 | + A attachment, | |
| 736 | + CompletionHandler<Integer,? super A> handler); | |
| 737 | + | |
| 738 | + /** | |
| 739 | + * Writes a sequence of bytes to this channel from the given buffer, starting | |
| 740 | + * at the given file position. | |
| 741 | + * | |
| 742 | + * <p> This method initiates the writing of a sequence of bytes to this | |
| 743 | + * channel from the given buffer, starting at the given file position. The | |
| 744 | + * method returns a {@code Future} representing the pending result of the | |
| 745 | + * write operation. The {@code Future}'s {@link Future#get() get} method | |
| 746 | + * returns the number of bytes written. | |
| 747 | + * | |
| 748 | + * <p> This method works in the same manner as the {@link | |
| 749 | + * AsynchronousByteChannel#write(ByteBuffer)} method, except that bytes are | |
| 750 | + * written starting at the given file position. If the given position is | |
| 751 | + * greater than the file's size, at the time that the write is attempted, | |
| 752 | + * then the file will be grown to accommodate the new bytes; the values of | |
| 753 | + * any bytes between the previous end-of-file and the newly-written bytes | |
| 754 | + * are unspecified. | |
| 755 | + * | |
| 756 | + * @param src | |
| 757 | + * The buffer from which bytes are to be transferred | |
| 758 | + * @param position | |
| 759 | + * The file position at which the transfer is to begin; | |
| 760 | + * must be non-negative | |
| 761 | + * | |
| 762 | + * @return A {@code Future} object representing the pending result | |
| 763 | + * | |
| 764 | + * @throws IllegalArgumentException | |
| 765 | + * If the position is negative | |
| 766 | + * @throws NonWritableChannelException | |
| 767 | + * If this channel was not opened for writing | |
| 768 | + */ | |
| 769 | + public abstract Future<Integer> write(ByteBuffer src, long position); | |
| 770 | +} | |
Binary file not shown.
| @@ -0,0 +1,300 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.nio.channels.spi.*; | |
| 29 | +import java.net.SocketOption; | |
| 30 | +import java.net.SocketAddress; | |
| 31 | +import java.util.concurrent.Future; | |
| 32 | +import java.io.IOException; | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * An asynchronous channel for stream-oriented listening sockets. | |
| 36 | + * | |
| 37 | + * <p> An asynchronous server-socket channel is created by invoking the | |
| 38 | + * {@link #open open} method of this class. | |
| 39 | + * A newly-created asynchronous server-socket channel is open but not yet bound. | |
| 40 | + * It can be bound to a local address and configured to listen for connections | |
| 41 | + * by invoking the {@link #bind(SocketAddress,int) bind} method. Once bound, | |
| 42 | + * the {@link #accept(Object,CompletionHandler) accept} method | |
| 43 | + * is used to initiate the accepting of connections to the channel's socket. | |
| 44 | + * An attempt to invoke the <tt>accept</tt> method on an unbound channel will | |
| 45 | + * cause a {@link NotYetBoundException} to be thrown. | |
| 46 | + * | |
| 47 | + * <p> Channels of this type are safe for use by multiple concurrent threads | |
| 48 | + * though at most one accept operation can be outstanding at any time. | |
| 49 | + * If a thread initiates an accept operation before a previous accept operation | |
| 50 | + * has completed then an {@link AcceptPendingException} will be thrown. | |
| 51 | + * | |
| 52 | + * <p> Socket options are configured using the {@link #setOption(SocketOption,Object) | |
| 53 | + * setOption} method. Channels of this type support the following options: | |
| 54 | + * <blockquote> | |
| 55 | + * <table border> | |
| 56 | + * <tr> | |
| 57 | + * <th>Option Name</th> | |
| 58 | + * <th>Description</th> | |
| 59 | + * </tr> | |
| 60 | + * <tr> | |
| 61 | + * <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td> | |
| 62 | + * <td> The size of the socket receive buffer </td> | |
| 63 | + * </tr> | |
| 64 | + * <tr> | |
| 65 | + * <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td> | |
| 66 | + * <td> Re-use address </td> | |
| 67 | + * </tr> | |
| 68 | + * </table> | |
| 69 | + * </blockquote> | |
| 70 | + * Additional (implementation specific) options may also be supported. | |
| 71 | + * | |
| 72 | + * <p> <b>Usage Example:</b> | |
| 73 | + * <pre> | |
| 74 | + * final AsynchronousServerSocketChannel listener = | |
| 75 | + * AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(5000)); | |
| 76 | + * | |
| 77 | + * listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() { | |
| 78 | + * public void completed(AsynchronousSocketChannel ch, Void att) { | |
| 79 | + * // accept the next connection | |
| 80 | + * listener.accept(null, this); | |
| 81 | + * | |
| 82 | + * // handle this connection | |
| 83 | + * handle(ch); | |
| 84 | + * } | |
| 85 | + * public void failed(Throwable exc, Void att) { | |
| 86 | + * ... | |
| 87 | + * } | |
| 88 | + * }); | |
| 89 | + * </pre> | |
| 90 | + * | |
| 91 | + * @since 1.7 | |
| 92 | + */ | |
| 93 | + | |
| 94 | +public abstract class AsynchronousServerSocketChannel | |
| 95 | + implements AsynchronousChannel, NetworkChannel | |
| 96 | +{ | |
| 97 | + private final AsynchronousChannelProvider provider; | |
| 98 | + | |
| 99 | + /** | |
| 100 | + * Initializes a new instance of this class. | |
| 101 | + */ | |
| 102 | + protected AsynchronousServerSocketChannel(AsynchronousChannelProvider provider) { | |
| 103 | + this.provider = provider; | |
| 104 | + } | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * Returns the provider that created this channel. | |
| 108 | + */ | |
| 109 | + public final AsynchronousChannelProvider provider() { | |
| 110 | + return provider; | |
| 111 | + } | |
| 112 | + | |
| 113 | + /** | |
| 114 | + * Opens an asynchronous server-socket channel. | |
| 115 | + * | |
| 116 | + * <p> The new channel is created by invoking the {@link | |
| 117 | + * java.nio.channels.spi.AsynchronousChannelProvider#openAsynchronousServerSocketChannel | |
| 118 | + * openAsynchronousServerSocketChannel} method on the {@link | |
| 119 | + * java.nio.channels.spi.AsynchronousChannelProvider} object that created | |
| 120 | + * the given group. If the group parameter is <tt>null</tt> then the | |
| 121 | + * resulting channel is created by the system-wide default provider, and | |
| 122 | + * bound to the <em>default group</em>. | |
| 123 | + * | |
| 124 | + * @param group | |
| 125 | + * The group to which the newly constructed channel should be bound, | |
| 126 | + * or <tt>null</tt> for the default group | |
| 127 | + * | |
| 128 | + * @return A new asynchronous server socket channel | |
| 129 | + * | |
| 130 | + * @throws ShutdownChannelGroupException | |
| 131 | + * If the channel group is shutdown | |
| 132 | + * @throws IOException | |
| 133 | + * If an I/O error occurs | |
| 134 | + */ | |
| 135 | + public static AsynchronousServerSocketChannel open(AsynchronousChannelGroup group) | |
| 136 | + throws IOException | |
| 137 | + { | |
| 138 | + AsynchronousChannelProvider provider = (group == null) ? | |
| 139 | + AsynchronousChannelProvider.provider() : group.provider(); | |
| 140 | + return provider.openAsynchronousServerSocketChannel(group); | |
| 141 | + } | |
| 142 | + | |
| 143 | + /** | |
| 144 | + * Opens an asynchronous server-socket channel. | |
| 145 | + * | |
| 146 | + * <p> This method returns an asynchronous server socket channel that is | |
| 147 | + * bound to the <em>default group</em>. This method is equivalent to evaluating | |
| 148 | + * the expression: | |
| 149 | + * <blockquote><pre> | |
| 150 | + * open((AsynchronousChannelGroup)null); | |
| 151 | + * </pre></blockquote> | |
| 152 | + * | |
| 153 | + * @return A new asynchronous server socket channel | |
| 154 | + * | |
| 155 | + * @throws IOException | |
| 156 | + * If an I/O error occurs | |
| 157 | + */ | |
| 158 | + public static AsynchronousServerSocketChannel open() | |
| 159 | + throws IOException | |
| 160 | + { | |
| 161 | + return open(null); | |
| 162 | + } | |
| 163 | + | |
| 164 | + /** | |
| 165 | + * Binds the channel's socket to a local address and configures the socket to | |
| 166 | + * listen for connections. | |
| 167 | + * | |
| 168 | + * <p> An invocation of this method is equivalent to the following: | |
| 169 | + * <blockquote><pre> | |
| 170 | + * bind(local, 0); | |
| 171 | + * </pre></blockquote> | |
| 172 | + * | |
| 173 | + * @param local | |
| 174 | + * The local address to bind the socket, or <tt>null</tt> to bind | |
| 175 | + * to an automatically assigned socket address | |
| 176 | + * | |
| 177 | + * @return This channel | |
| 178 | + * | |
| 179 | + * @throws AlreadyBoundException {@inheritDoc} | |
| 180 | + * @throws UnsupportedAddressTypeException {@inheritDoc} | |
| 181 | + * @throws SecurityException {@inheritDoc} | |
| 182 | + * @throws ClosedChannelException {@inheritDoc} | |
| 183 | + * @throws IOException {@inheritDoc} | |
| 184 | + */ | |
| 185 | + public final AsynchronousServerSocketChannel bind(SocketAddress local) | |
| 186 | + throws IOException | |
| 187 | + { | |
| 188 | + return bind(local, 0); | |
| 189 | + } | |
| 190 | + | |
| 191 | + /** | |
| 192 | + * Binds the channel's socket to a local address and configures the socket to | |
| 193 | + * listen for connections. | |
| 194 | + * | |
| 195 | + * <p> This method is used to establish an association between the socket and | |
| 196 | + * a local address. Once an association is established then the socket remains | |
| 197 | + * bound until the associated channel is closed. | |
| 198 | + * | |
| 199 | + * <p> The {@code backlog} parameter is the maximum number of pending | |
| 200 | + * connections on the socket. Its exact semantics are implementation specific. | |
| 201 | + * In particular, an implementation may impose a maximum length or may choose | |
| 202 | + * to ignore the parameter altogther. If the {@code backlog} parameter has | |
| 203 | + * the value {@code 0}, or a negative value, then an implementation specific | |
| 204 | + * default is used. | |
| 205 | + * | |
| 206 | + * @param local | |
| 207 | + * The local address to bind the socket, or {@code null} to bind | |
| 208 | + * to an automatically assigned socket address | |
| 209 | + * @param backlog | |
| 210 | + * The maximum number of pending connections | |
| 211 | + * | |
| 212 | + * @return This channel | |
| 213 | + * | |
| 214 | + * @throws AlreadyBoundException | |
| 215 | + * If the socket is already bound | |
| 216 | + * @throws UnsupportedAddressTypeException | |
| 217 | + * If the type of the given address is not supported | |
| 218 | + * @throws SecurityException | |
| 219 | + * If a security manager has been installed and its {@link | |
| 220 | + * SecurityManager#checkListen checkListen} method denies the operation | |
| 221 | + * @throws ClosedChannelException | |
| 222 | + * If the channel is closed | |
| 223 | + * @throws IOException | |
| 224 | + * If some other I/O error occurs | |
| 225 | + */ | |
| 226 | + public abstract AsynchronousServerSocketChannel bind(SocketAddress local, int backlog) | |
| 227 | + throws IOException; | |
| 228 | + | |
| 229 | + /** | |
| 230 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 231 | + * @throws ClosedChannelException {@inheritDoc} | |
| 232 | + * @throws IOException {@inheritDoc} | |
| 233 | + */ | |
| 234 | + public abstract <T> AsynchronousServerSocketChannel setOption(SocketOption<T> name, T value) | |
| 235 | + throws IOException; | |
| 236 | + | |
| 237 | + /** | |
| 238 | + * Accepts a connection. | |
| 239 | + * | |
| 240 | + * <p> This method initiates an asynchronous operation to accept a | |
| 241 | + * connection made to this channel's socket. The {@code handler} parameter is | |
| 242 | + * a completion handler that is invoked when a connection is accepted (or | |
| 243 | + * the operation fails). The result passed to the completion handler is | |
| 244 | + * the {@link AsynchronousSocketChannel} to the new connection. | |
| 245 | + * | |
| 246 | + * <p> When a new connection is accepted then the resulting {@code | |
| 247 | + * AsynchronousSocketChannel} will be bound to the same {@link | |
| 248 | + * AsynchronousChannelGroup} as this channel. If the group is {@link | |
| 249 | + * AsynchronousChannelGroup#isShutdown shutdown} and a connection is accepted, | |
| 250 | + * then the connection is closed, and the operation completes with an {@code | |
| 251 | + * IOException} and cause {@link ShutdownChannelGroupException}. | |
| 252 | + * | |
| 253 | + * <p> To allow for concurrent handling of new connections, the completion | |
| 254 | + * handler is not invoked directly by the initiating thread when a new | |
| 255 | + * connection is accepted immediately (see <a | |
| 256 | + * href="AsynchronousChannelGroup.html#threading">Threading<a>). | |
| 257 | + * | |
| 258 | + * <p> If a security manager has been installed then it verifies that the | |
| 259 | + * address and port number of the connection's remote endpoint are permitted | |
| 260 | + * by the security manager's {@link SecurityManager#checkAccept checkAccept} | |
| 261 | + * method. The permission check is performed with privileges that are restricted | |
| 262 | + * by the calling context of this method. If the permission check fails then | |
| 263 | + * the connection is closed and the operation completes with a {@link | |
| 264 | + * SecurityException}. | |
| 265 | + * | |
| 266 | + * @param attachment | |
| 267 | + * The object to attach to the I/O operation; can be {@code null} | |
| 268 | + * @param handler | |
| 269 | + * The handler for consuming the result | |
| 270 | + * | |
| 271 | + * @throws AcceptPendingException | |
| 272 | + * If an accept operation is already in progress on this channel | |
| 273 | + * @throws NotYetBoundException | |
| 274 | + * If this channel's socket has not yet been bound | |
| 275 | + * @throws ShutdownChannelGroupException | |
| 276 | + * If the channel group has terminated | |
| 277 | + */ | |
| 278 | + public abstract <A> void accept(A attachment, | |
| 279 | + CompletionHandler<AsynchronousSocketChannel,? super A> handler); | |
| 280 | + | |
| 281 | + /** | |
| 282 | + * Accepts a connection. | |
| 283 | + * | |
| 284 | + * <p> This method initiates an asynchronous operation to accept a | |
| 285 | + * connection made to this channel's socket. The method behaves in exactly | |
| 286 | + * the same manner as the {@link #accept(Object, CompletionHandler)} method | |
| 287 | + * except that instead of specifying a completion handler, this method | |
| 288 | + * returns a {@code Future} representing the pending result. The {@code | |
| 289 | + * Future}'s {@link Future#get() get} method returns the {@link | |
| 290 | + * AsynchronousSocketChannel} to the new connection on successful completion. | |
| 291 | + * | |
| 292 | + * @return a {@code Future} object representing the pending result | |
| 293 | + * | |
| 294 | + * @throws AcceptPendingException | |
| 295 | + * If an accept operation is already in progress on this channel | |
| 296 | + * @throws NotYetBoundException | |
| 297 | + * If this channel's socket has not yet been bound | |
| 298 | + */ | |
| 299 | + public abstract Future<AsynchronousSocketChannel> accept(); | |
| 300 | +} | |
Binary file not shown.
| @@ -0,0 +1,648 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2010, 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.nio.channels.spi.*; | |
| 29 | +import java.util.concurrent.TimeUnit; | |
| 30 | +import java.util.concurrent.Future; | |
| 31 | +import java.io.IOException; | |
| 32 | +import java.net.SocketOption; | |
| 33 | +import java.net.SocketAddress; | |
| 34 | +import java.nio.ByteBuffer; | |
| 35 | + | |
| 36 | +/** | |
| 37 | + * An asynchronous channel for stream-oriented connecting sockets. | |
| 38 | + * | |
| 39 | + * <p> Asynchronous socket channels are created in one of two ways. A newly-created | |
| 40 | + * {@code AsynchronousSocketChannel} is created by invoking one of the {@link | |
| 41 | + * #open open} methods defined by this class. A newly-created channel is open but | |
| 42 | + * not yet connected. A connected {@code AsynchronousSocketChannel} is created | |
| 43 | + * when a connection is made to the socket of an {@link AsynchronousServerSocketChannel}. | |
| 44 | + * It is not possible to create an asynchronous socket channel for an arbitrary, | |
| 45 | + * pre-existing {@link java.net.Socket socket}. | |
| 46 | + * | |
| 47 | + * <p> A newly-created channel is connected by invoking its {@link #connect connect} | |
| 48 | + * method; once connected, a channel remains connected until it is closed. Whether | |
| 49 | + * or not a socket channel is connected may be determined by invoking its {@link | |
| 50 | + * #getRemoteAddress getRemoteAddress} method. An attempt to invoke an I/O | |
| 51 | + * operation upon an unconnected channel will cause a {@link NotYetConnectedException} | |
| 52 | + * to be thrown. | |
| 53 | + * | |
| 54 | + * <p> Channels of this type are safe for use by multiple concurrent threads. | |
| 55 | + * They support concurrent reading and writing, though at most one read operation | |
| 56 | + * and one write operation can be outstanding at any time. | |
| 57 | + * If a thread initiates a read operation before a previous read operation has | |
| 58 | + * completed then a {@link ReadPendingException} will be thrown. Similarly, an | |
| 59 | + * attempt to initiate a write operation before a previous write has completed | |
| 60 | + * will throw a {@link WritePendingException}. | |
| 61 | + * | |
| 62 | + * <p> Socket options are configured using the {@link #setOption(SocketOption,Object) | |
| 63 | + * setOption} method. Asynchronous socket channels support the following options: | |
| 64 | + * <blockquote> | |
| 65 | + * <table border> | |
| 66 | + * <tr> | |
| 67 | + * <th>Option Name</th> | |
| 68 | + * <th>Description</th> | |
| 69 | + * </tr> | |
| 70 | + * <tr> | |
| 71 | + * <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td> | |
| 72 | + * <td> The size of the socket send buffer </td> | |
| 73 | + * </tr> | |
| 74 | + * <tr> | |
| 75 | + * <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td> | |
| 76 | + * <td> The size of the socket receive buffer </td> | |
| 77 | + * </tr> | |
| 78 | + * <tr> | |
| 79 | + * <td> {@link java.net.StandardSocketOptions#SO_KEEPALIVE SO_KEEPALIVE} </td> | |
| 80 | + * <td> Keep connection alive </td> | |
| 81 | + * </tr> | |
| 82 | + * <tr> | |
| 83 | + * <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td> | |
| 84 | + * <td> Re-use address </td> | |
| 85 | + * </tr> | |
| 86 | + * <tr> | |
| 87 | + * <td> {@link java.net.StandardSocketOptions#TCP_NODELAY TCP_NODELAY} </td> | |
| 88 | + * <td> Disable the Nagle algorithm </td> | |
| 89 | + * </tr> | |
| 90 | + * </table> | |
| 91 | + * </blockquote> | |
| 92 | + * Additional (implementation specific) options may also be supported. | |
| 93 | + * | |
| 94 | + * <h4>Timeouts</h4> | |
| 95 | + * | |
| 96 | + * <p> The {@link #read(ByteBuffer,long,TimeUnit,Object,CompletionHandler) read} | |
| 97 | + * and {@link #write(ByteBuffer,long,TimeUnit,Object,CompletionHandler) write} | |
| 98 | + * methods defined by this class allow a timeout to be specified when initiating | |
| 99 | + * a read or write operation. If the timeout elapses before an operation completes | |
| 100 | + * then the operation completes with the exception {@link | |
| 101 | + * InterruptedByTimeoutException}. A timeout may leave the channel, or the | |
| 102 | + * underlying connection, in an inconsistent state. Where the implementation | |
| 103 | + * cannot guarantee that bytes have not been read from the channel then it puts | |
| 104 | + * the channel into an implementation specific <em>error state</em>. A subsequent | |
| 105 | + * attempt to initiate a {@code read} operation causes an unspecified runtime | |
| 106 | + * exception to be thrown. Similarly if a {@code write} operation times out and | |
| 107 | + * the implementation cannot guarantee bytes have not been written to the | |
| 108 | + * channel then further attempts to {@code write} to the channel cause an | |
| 109 | + * unspecified runtime exception to be thrown. When a timeout elapses then the | |
| 110 | + * state of the {@link ByteBuffer}, or the sequence of buffers, for the I/O | |
| 111 | + * operation is not defined. Buffers should be discarded or at least care must | |
| 112 | + * be taken to ensure that the buffers are not accessed while the channel remains | |
| 113 | + * open. All methods that accept timeout parameters treat values less than or | |
| 114 | + * equal to zero to mean that the I/O operation does not timeout. | |
| 115 | + * | |
| 116 | + * @since 1.7 | |
| 117 | + */ | |
| 118 | + | |
| 119 | +public abstract class AsynchronousSocketChannel | |
| 120 | + implements AsynchronousByteChannel, NetworkChannel | |
| 121 | +{ | |
| 122 | + private final AsynchronousChannelProvider provider; | |
| 123 | + | |
| 124 | + /** | |
| 125 | + * Initializes a new instance of this class. | |
| 126 | + */ | |
| 127 | + protected AsynchronousSocketChannel(AsynchronousChannelProvider provider) { | |
| 128 | + this.provider = provider; | |
| 129 | + } | |
| 130 | + | |
| 131 | + /** | |
| 132 | + * Returns the provider that created this channel. | |
| 133 | + */ | |
| 134 | + public final AsynchronousChannelProvider provider() { | |
| 135 | + return provider; | |
| 136 | + } | |
| 137 | + | |
| 138 | + /** | |
| 139 | + * Opens an asynchronous socket channel. | |
| 140 | + * | |
| 141 | + * <p> The new channel is created by invoking the {@link | |
| 142 | + * AsynchronousChannelProvider#openAsynchronousSocketChannel | |
| 143 | + * openAsynchronousSocketChannel} method on the {@link | |
| 144 | + * AsynchronousChannelProvider} that created the group. If the group parameter | |
| 145 | + * is {@code null} then the resulting channel is created by the system-wide | |
| 146 | + * default provider, and bound to the <em>default group</em>. | |
| 147 | + * | |
| 148 | + * @param group | |
| 149 | + * The group to which the newly constructed channel should be bound, | |
| 150 | + * or {@code null} for the default group | |
| 151 | + * | |
| 152 | + * @return A new asynchronous socket channel | |
| 153 | + * | |
| 154 | + * @throws ShutdownChannelGroupException | |
| 155 | + * If the channel group is shutdown | |
| 156 | + * @throws IOException | |
| 157 | + * If an I/O error occurs | |
| 158 | + */ | |
| 159 | + public static AsynchronousSocketChannel open(AsynchronousChannelGroup group) | |
| 160 | + throws IOException | |
| 161 | + { | |
| 162 | + AsynchronousChannelProvider provider = (group == null) ? | |
| 163 | + AsynchronousChannelProvider.provider() : group.provider(); | |
| 164 | + return provider.openAsynchronousSocketChannel(group); | |
| 165 | + } | |
| 166 | + | |
| 167 | + /** | |
| 168 | + * Opens an asynchronous socket channel. | |
| 169 | + * | |
| 170 | + * <p> This method returns an asynchronous socket channel that is bound to | |
| 171 | + * the <em>default group</em>.This method is equivalent to evaluating the | |
| 172 | + * expression: | |
| 173 | + * <blockquote><pre> | |
| 174 | + * open((AsynchronousChannelGroup)null); | |
| 175 | + * </pre></blockquote> | |
| 176 | + * | |
| 177 | + * @return A new asynchronous socket channel | |
| 178 | + * | |
| 179 | + * @throws IOException | |
| 180 | + * If an I/O error occurs | |
| 181 | + */ | |
| 182 | + public static AsynchronousSocketChannel open() | |
| 183 | + throws IOException | |
| 184 | + { | |
| 185 | + return open(null); | |
| 186 | + } | |
| 187 | + | |
| 188 | + | |
| 189 | + // -- socket options and related -- | |
| 190 | + | |
| 191 | + /** | |
| 192 | + * @throws ConnectionPendingException | |
| 193 | + * If a connection operation is already in progress on this channel | |
| 194 | + * @throws AlreadyBoundException {@inheritDoc} | |
| 195 | + * @throws UnsupportedAddressTypeException {@inheritDoc} | |
| 196 | + * @throws ClosedChannelException {@inheritDoc} | |
| 197 | + * @throws IOException {@inheritDoc} | |
| 198 | + */ | |
| 199 | + @Override | |
| 200 | + public abstract AsynchronousSocketChannel bind(SocketAddress local) | |
| 201 | + throws IOException; | |
| 202 | + | |
| 203 | + /** | |
| 204 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 205 | + * @throws ClosedChannelException {@inheritDoc} | |
| 206 | + * @throws IOException {@inheritDoc} | |
| 207 | + */ | |
| 208 | + @Override | |
| 209 | + public abstract <T> AsynchronousSocketChannel setOption(SocketOption<T> name, T value) | |
| 210 | + throws IOException; | |
| 211 | + | |
| 212 | + /** | |
| 213 | + * Shutdown the connection for reading without closing the channel. | |
| 214 | + * | |
| 215 | + * <p> Once shutdown for reading then further reads on the channel will | |
| 216 | + * return {@code -1}, the end-of-stream indication. If the input side of the | |
| 217 | + * connection is already shutdown then invoking this method has no effect. | |
| 218 | + * The effect on an outstanding read operation is system dependent and | |
| 219 | + * therefore not specified. The effect, if any, when there is data in the | |
| 220 | + * socket receive buffer that has not been read, or data arrives subsequently, | |
| 221 | + * is also system dependent. | |
| 222 | + * | |
| 223 | + * @return The channel | |
| 224 | + * | |
| 225 | + * @throws NotYetConnectedException | |
| 226 | + * If this channel is not yet connected | |
| 227 | + * @throws ClosedChannelException | |
| 228 | + * If this channel is closed | |
| 229 | + * @throws IOException | |
| 230 | + * If some other I/O error occurs | |
| 231 | + */ | |
| 232 | + public abstract AsynchronousSocketChannel shutdownInput() throws IOException; | |
| 233 | + | |
| 234 | + /** | |
| 235 | + * Shutdown the connection for writing without closing the channel. | |
| 236 | + * | |
| 237 | + * <p> Once shutdown for writing then further attempts to write to the | |
| 238 | + * channel will throw {@link ClosedChannelException}. If the output side of | |
| 239 | + * the connection is already shutdown then invoking this method has no | |
| 240 | + * effect. The effect on an outstanding write operation is system dependent | |
| 241 | + * and therefore not specified. | |
| 242 | + * | |
| 243 | + * @return The channel | |
| 244 | + * | |
| 245 | + * @throws NotYetConnectedException | |
| 246 | + * If this channel is not yet connected | |
| 247 | + * @throws ClosedChannelException | |
| 248 | + * If this channel is closed | |
| 249 | + * @throws IOException | |
| 250 | + * If some other I/O error occurs | |
| 251 | + */ | |
| 252 | + public abstract AsynchronousSocketChannel shutdownOutput() throws IOException; | |
| 253 | + | |
| 254 | + // -- state -- | |
| 255 | + | |
| 256 | + /** | |
| 257 | + * Returns the remote address to which this channel's socket is connected. | |
| 258 | + * | |
| 259 | + * <p> Where the channel is bound and connected to an Internet Protocol | |
| 260 | + * socket address then the return value from this method is of type {@link | |
| 261 | + * java.net.InetSocketAddress}. | |
| 262 | + * | |
| 263 | + * @return The remote address; {@code null} if the channel's socket is not | |
| 264 | + * connected | |
| 265 | + * | |
| 266 | + * @throws ClosedChannelException | |
| 267 | + * If the channel is closed | |
| 268 | + * @throws IOException | |
| 269 | + * If an I/O error occurs | |
| 270 | + */ | |
| 271 | + public abstract SocketAddress getRemoteAddress() throws IOException; | |
| 272 | + | |
| 273 | + // -- asynchronous operations -- | |
| 274 | + | |
| 275 | + /** | |
| 276 | + * Connects this channel. | |
| 277 | + * | |
| 278 | + * <p> This method initiates an operation to connect this channel. The | |
| 279 | + * {@code handler} parameter is a completion handler that is invoked when | |
| 280 | + * the connection is successfully established or connection cannot be | |
| 281 | + * established. If the connection cannot be established then the channel is | |
| 282 | + * closed. | |
| 283 | + * | |
| 284 | + * <p> This method performs exactly the same security checks as the {@link | |
| 285 | + * java.net.Socket} class. That is, if a security manager has been | |
| 286 | + * installed then this method verifies that its {@link | |
| 287 | + * java.lang.SecurityManager#checkConnect checkConnect} method permits | |
| 288 | + * connecting to the address and port number of the given remote endpoint. | |
| 289 | + * | |
| 290 | + * @param remote | |
| 291 | + * The remote address to which this channel is to be connected | |
| 292 | + * @param attachment | |
| 293 | + * The object to attach to the I/O operation; can be {@code null} | |
| 294 | + * @param handler | |
| 295 | + * The handler for consuming the result | |
| 296 | + * | |
| 297 | + * @throws UnresolvedAddressException | |
| 298 | + * If the given remote address is not fully resolved | |
| 299 | + * @throws UnsupportedAddressTypeException | |
| 300 | + * If the type of the given remote address is not supported | |
| 301 | + * @throws AlreadyConnectedException | |
| 302 | + * If this channel is already connected | |
| 303 | + * @throws ConnectionPendingException | |
| 304 | + * If a connection operation is already in progress on this channel | |
| 305 | + * @throws ShutdownChannelGroupException | |
| 306 | + * If the channel group has terminated | |
| 307 | + * @throws SecurityException | |
| 308 | + * If a security manager has been installed | |
| 309 | + * and it does not permit access to the given remote endpoint | |
| 310 | + * | |
| 311 | + * @see #getRemoteAddress | |
| 312 | + */ | |
| 313 | + public abstract <A> void connect(SocketAddress remote, | |
| 314 | + A attachment, | |
| 315 | + CompletionHandler<Void,? super A> handler); | |
| 316 | + | |
| 317 | + /** | |
| 318 | + * Connects this channel. | |
| 319 | + * | |
| 320 | + * <p> This method initiates an operation to connect this channel. This | |
| 321 | + * method behaves in exactly the same manner as the {@link | |
| 322 | + * #connect(SocketAddress, Object, CompletionHandler)} method except that | |
| 323 | + * instead of specifying a completion handler, this method returns a {@code | |
| 324 | + * Future} representing the pending result. The {@code Future}'s {@link | |
| 325 | + * Future#get() get} method returns {@code null} on successful completion. | |
| 326 | + * | |
| 327 | + * @param remote | |
| 328 | + * The remote address to which this channel is to be connected | |
| 329 | + * | |
| 330 | + * @return A {@code Future} object representing the pending result | |
| 331 | + * | |
| 332 | + * @throws UnresolvedAddressException | |
| 333 | + * If the given remote address is not fully resolved | |
| 334 | + * @throws UnsupportedAddressTypeException | |
| 335 | + * If the type of the given remote address is not supported | |
| 336 | + * @throws AlreadyConnectedException | |
| 337 | + * If this channel is already connected | |
| 338 | + * @throws ConnectionPendingException | |
| 339 | + * If a connection operation is already in progress on this channel | |
| 340 | + * @throws SecurityException | |
| 341 | + * If a security manager has been installed | |
| 342 | + * and it does not permit access to the given remote endpoint | |
| 343 | + */ | |
| 344 | + public abstract Future<Void> connect(SocketAddress remote); | |
| 345 | + | |
| 346 | + /** | |
| 347 | + * Reads a sequence of bytes from this channel into the given buffer. | |
| 348 | + * | |
| 349 | + * <p> This method initiates an asynchronous read operation to read a | |
| 350 | + * sequence of bytes from this channel into the given buffer. The {@code | |
| 351 | + * handler} parameter is a completion handler that is invoked when the read | |
| 352 | + * operation completes (or fails). The result passed to the completion | |
| 353 | + * handler is the number of bytes read or {@code -1} if no bytes could be | |
| 354 | + * read because the channel has reached end-of-stream. | |
| 355 | + * | |
| 356 | + * <p> If a timeout is specified and the timeout elapses before the operation | |
| 357 | + * completes then the operation completes with the exception {@link | |
| 358 | + * InterruptedByTimeoutException}. Where a timeout occurs, and the | |
| 359 | + * implementation cannot guarantee that bytes have not been read, or will not | |
| 360 | + * be read from the channel into the given buffer, then further attempts to | |
| 361 | + * read from the channel will cause an unspecific runtime exception to be | |
| 362 | + * thrown. | |
| 363 | + * | |
| 364 | + * <p> Otherwise this method works in the same manner as the {@link | |
| 365 | + * AsynchronousByteChannel#read(ByteBuffer,Object,CompletionHandler)} | |
| 366 | + * method. | |
| 367 | + * | |
| 368 | + * @param dst | |
| 369 | + * The buffer into which bytes are to be transferred | |
| 370 | + * @param timeout | |
| 371 | + * The maximum time for the I/O operation to complete | |
| 372 | + * @param unit | |
| 373 | + * The time unit of the {@code timeout} argument | |
| 374 | + * @param attachment | |
| 375 | + * The object to attach to the I/O operation; can be {@code null} | |
| 376 | + * @param handler | |
| 377 | + * The handler for consuming the result | |
| 378 | + * | |
| 379 | + * @throws IllegalArgumentException | |
| 380 | + * If the buffer is read-only | |
| 381 | + * @throws ReadPendingException | |
| 382 | + * If a read operation is already in progress on this channel | |
| 383 | + * @throws NotYetConnectedException | |
| 384 | + * If this channel is not yet connected | |
| 385 | + * @throws ShutdownChannelGroupException | |
| 386 | + * If the channel group has terminated | |
| 387 | + */ | |
| 388 | + public abstract <A> void read(ByteBuffer dst, | |
| 389 | + long timeout, | |
| 390 | + TimeUnit unit, | |
| 391 | + A attachment, | |
| 392 | + CompletionHandler<Integer,? super A> handler); | |
| 393 | + | |
| 394 | + /** | |
| 395 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 396 | + * @throws ReadPendingException {@inheritDoc} | |
| 397 | + * @throws NotYetConnectedException | |
| 398 | + * If this channel is not yet connected | |
| 399 | + * @throws ShutdownChannelGroupException | |
| 400 | + * If the channel group has terminated | |
| 401 | + */ | |
| 402 | + @Override | |
| 403 | + public final <A> void read(ByteBuffer dst, | |
| 404 | + A attachment, | |
| 405 | + CompletionHandler<Integer,? super A> handler) | |
| 406 | + { | |
| 407 | + read(dst, 0L, TimeUnit.MILLISECONDS, attachment, handler); | |
| 408 | + } | |
| 409 | + | |
| 410 | + /** | |
| 411 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 412 | + * @throws ReadPendingException {@inheritDoc} | |
| 413 | + * @throws NotYetConnectedException | |
| 414 | + * If this channel is not yet connected | |
| 415 | + */ | |
| 416 | + @Override | |
| 417 | + public abstract Future<Integer> read(ByteBuffer dst); | |
| 418 | + | |
| 419 | + /** | |
| 420 | + * Reads a sequence of bytes from this channel into a subsequence of the | |
| 421 | + * given buffers. This operation, sometimes called a <em>scattering read</em>, | |
| 422 | + * is often useful when implementing network protocols that group data into | |
| 423 | + * segments consisting of one or more fixed-length headers followed by a | |
| 424 | + * variable-length body. The {@code handler} parameter is a completion | |
| 425 | + * handler that is invoked when the read operation completes (or fails). The | |
| 426 | + * result passed to the completion handler is the number of bytes read or | |
| 427 | + * {@code -1} if no bytes could be read because the channel has reached | |
| 428 | + * end-of-stream. | |
| 429 | + * | |
| 430 | + * <p> This method initiates a read of up to <i>r</i> bytes from this channel, | |
| 431 | + * where <i>r</i> is the total number of bytes remaining in the specified | |
| 432 | + * subsequence of the given buffer array, that is, | |
| 433 | + * | |
| 434 | + * <blockquote><pre> | |
| 435 | + * dsts[offset].remaining() | |
| 436 | + * + dsts[offset+1].remaining() | |
| 437 | + * + ... + dsts[offset+length-1].remaining()</pre></blockquote> | |
| 438 | + * | |
| 439 | + * at the moment that the read is attempted. | |
| 440 | + * | |
| 441 | + * <p> Suppose that a byte sequence of length <i>n</i> is read, where | |
| 442 | + * <tt>0</tt> <tt><</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 443 | + * Up to the first <tt>dsts[offset].remaining()</tt> bytes of this sequence | |
| 444 | + * are transferred into buffer <tt>dsts[offset]</tt>, up to the next | |
| 445 | + * <tt>dsts[offset+1].remaining()</tt> bytes are transferred into buffer | |
| 446 | + * <tt>dsts[offset+1]</tt>, and so forth, until the entire byte sequence | |
| 447 | + * is transferred into the given buffers. As many bytes as possible are | |
| 448 | + * transferred into each buffer, hence the final position of each updated | |
| 449 | + * buffer, except the last updated buffer, is guaranteed to be equal to | |
| 450 | + * that buffer's limit. The underlying operating system may impose a limit | |
| 451 | + * on the number of buffers that may be used in an I/O operation. Where the | |
| 452 | + * number of buffers (with bytes remaining), exceeds this limit, then the | |
| 453 | + * I/O operation is performed with the maximum number of buffers allowed by | |
| 454 | + * the operating system. | |
| 455 | + * | |
| 456 | + * <p> If a timeout is specified and the timeout elapses before the operation | |
| 457 | + * completes then it completes with the exception {@link | |
| 458 | + * InterruptedByTimeoutException}. Where a timeout occurs, and the | |
| 459 | + * implementation cannot guarantee that bytes have not been read, or will not | |
| 460 | + * be read from the channel into the given buffers, then further attempts to | |
| 461 | + * read from the channel will cause an unspecific runtime exception to be | |
| 462 | + * thrown. | |
| 463 | + * | |
| 464 | + * @param dsts | |
| 465 | + * The buffers into which bytes are to be transferred | |
| 466 | + * @param offset | |
| 467 | + * The offset within the buffer array of the first buffer into which | |
| 468 | + * bytes are to be transferred; must be non-negative and no larger than | |
| 469 | + * {@code dsts.length} | |
| 470 | + * @param length | |
| 471 | + * The maximum number of buffers to be accessed; must be non-negative | |
| 472 | + * and no larger than {@code dsts.length - offset} | |
| 473 | + * @param timeout | |
| 474 | + * The maximum time for the I/O operation to complete | |
| 475 | + * @param unit | |
| 476 | + * The time unit of the {@code timeout} argument | |
| 477 | + * @param attachment | |
| 478 | + * The object to attach to the I/O operation; can be {@code null} | |
| 479 | + * @param handler | |
| 480 | + * The handler for consuming the result | |
| 481 | + * | |
| 482 | + * @throws IndexOutOfBoundsException | |
| 483 | + * If the pre-conditions for the {@code offset} and {@code length} | |
| 484 | + * parameter aren't met | |
| 485 | + * @throws IllegalArgumentException | |
| 486 | + * If the buffer is read-only | |
| 487 | + * @throws ReadPendingException | |
| 488 | + * If a read operation is already in progress on this channel | |
| 489 | + * @throws NotYetConnectedException | |
| 490 | + * If this channel is not yet connected | |
| 491 | + * @throws ShutdownChannelGroupException | |
| 492 | + * If the channel group has terminated | |
| 493 | + */ | |
| 494 | + public abstract <A> void read(ByteBuffer[] dsts, | |
| 495 | + int offset, | |
| 496 | + int length, | |
| 497 | + long timeout, | |
| 498 | + TimeUnit unit, | |
| 499 | + A attachment, | |
| 500 | + CompletionHandler<Long,? super A> handler); | |
| 501 | + | |
| 502 | + /** | |
| 503 | + * Writes a sequence of bytes to this channel from the given buffer. | |
| 504 | + * | |
| 505 | + * <p> This method initiates an asynchronous write operation to write a | |
| 506 | + * sequence of bytes to this channel from the given buffer. The {@code | |
| 507 | + * handler} parameter is a completion handler that is invoked when the write | |
| 508 | + * operation completes (or fails). The result passed to the completion | |
| 509 | + * handler is the number of bytes written. | |
| 510 | + * | |
| 511 | + * <p> If a timeout is specified and the timeout elapses before the operation | |
| 512 | + * completes then it completes with the exception {@link | |
| 513 | + * InterruptedByTimeoutException}. Where a timeout occurs, and the | |
| 514 | + * implementation cannot guarantee that bytes have not been written, or will | |
| 515 | + * not be written to the channel from the given buffer, then further attempts | |
| 516 | + * to write to the channel will cause an unspecific runtime exception to be | |
| 517 | + * thrown. | |
| 518 | + * | |
| 519 | + * <p> Otherwise this method works in the same manner as the {@link | |
| 520 | + * AsynchronousByteChannel#write(ByteBuffer,Object,CompletionHandler)} | |
| 521 | + * method. | |
| 522 | + * | |
| 523 | + * @param src | |
| 524 | + * The buffer from which bytes are to be retrieved | |
| 525 | + * @param timeout | |
| 526 | + * The maximum time for the I/O operation to complete | |
| 527 | + * @param unit | |
| 528 | + * The time unit of the {@code timeout} argument | |
| 529 | + * @param attachment | |
| 530 | + * The object to attach to the I/O operation; can be {@code null} | |
| 531 | + * @param handler | |
| 532 | + * The handler for consuming the result | |
| 533 | + * | |
| 534 | + * @throws WritePendingException | |
| 535 | + * If a write operation is already in progress on this channel | |
| 536 | + * @throws NotYetConnectedException | |
| 537 | + * If this channel is not yet connected | |
| 538 | + * @throws ShutdownChannelGroupException | |
| 539 | + * If the channel group has terminated | |
| 540 | + */ | |
| 541 | + public abstract <A> void write(ByteBuffer src, | |
| 542 | + long timeout, | |
| 543 | + TimeUnit unit, | |
| 544 | + A attachment, | |
| 545 | + CompletionHandler<Integer,? super A> handler); | |
| 546 | + | |
| 547 | + /** | |
| 548 | + * @throws WritePendingException {@inheritDoc} | |
| 549 | + * @throws NotYetConnectedException | |
| 550 | + * If this channel is not yet connected | |
| 551 | + * @throws ShutdownChannelGroupException | |
| 552 | + * If the channel group has terminated | |
| 553 | + */ | |
| 554 | + @Override | |
| 555 | + public final <A> void write(ByteBuffer src, | |
| 556 | + A attachment, | |
| 557 | + CompletionHandler<Integer,? super A> handler) | |
| 558 | + | |
| 559 | + { | |
| 560 | + write(src, 0L, TimeUnit.MILLISECONDS, attachment, handler); | |
| 561 | + } | |
| 562 | + | |
| 563 | + /** | |
| 564 | + * @throws WritePendingException {@inheritDoc} | |
| 565 | + * @throws NotYetConnectedException | |
| 566 | + * If this channel is not yet connected | |
| 567 | + */ | |
| 568 | + @Override | |
| 569 | + public abstract Future<Integer> write(ByteBuffer src); | |
| 570 | + | |
| 571 | + /** | |
| 572 | + * Writes a sequence of bytes to this channel from a subsequence of the given | |
| 573 | + * buffers. This operation, sometimes called a <em>gathering write</em>, is | |
| 574 | + * often useful when implementing network protocols that group data into | |
| 575 | + * segments consisting of one or more fixed-length headers followed by a | |
| 576 | + * variable-length body. The {@code handler} parameter is a completion | |
| 577 | + * handler that is invoked when the write operation completes (or fails). | |
| 578 | + * The result passed to the completion handler is the number of bytes written. | |
| 579 | + * | |
| 580 | + * <p> This method initiates a write of up to <i>r</i> bytes to this channel, | |
| 581 | + * where <i>r</i> is the total number of bytes remaining in the specified | |
| 582 | + * subsequence of the given buffer array, that is, | |
| 583 | + * | |
| 584 | + * <blockquote><pre> | |
| 585 | + * srcs[offset].remaining() | |
| 586 | + * + srcs[offset+1].remaining() | |
| 587 | + * + ... + srcs[offset+length-1].remaining()</pre></blockquote> | |
| 588 | + * | |
| 589 | + * at the moment that the write is attempted. | |
| 590 | + * | |
| 591 | + * <p> Suppose that a byte sequence of length <i>n</i> is written, where | |
| 592 | + * <tt>0</tt> <tt><</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 593 | + * Up to the first <tt>srcs[offset].remaining()</tt> bytes of this sequence | |
| 594 | + * are written from buffer <tt>srcs[offset]</tt>, up to the next | |
| 595 | + * <tt>srcs[offset+1].remaining()</tt> bytes are written from buffer | |
| 596 | + * <tt>srcs[offset+1]</tt>, and so forth, until the entire byte sequence is | |
| 597 | + * written. As many bytes as possible are written from each buffer, hence | |
| 598 | + * the final position of each updated buffer, except the last updated | |
| 599 | + * buffer, is guaranteed to be equal to that buffer's limit. The underlying | |
| 600 | + * operating system may impose a limit on the number of buffers that may be | |
| 601 | + * used in an I/O operation. Where the number of buffers (with bytes | |
| 602 | + * remaining), exceeds this limit, then the I/O operation is performed with | |
| 603 | + * the maximum number of buffers allowed by the operating system. | |
| 604 | + * | |
| 605 | + * <p> If a timeout is specified and the timeout elapses before the operation | |
| 606 | + * completes then it completes with the exception {@link | |
| 607 | + * InterruptedByTimeoutException}. Where a timeout occurs, and the | |
| 608 | + * implementation cannot guarantee that bytes have not been written, or will | |
| 609 | + * not be written to the channel from the given buffers, then further attempts | |
| 610 | + * to write to the channel will cause an unspecific runtime exception to be | |
| 611 | + * thrown. | |
| 612 | + * | |
| 613 | + * @param srcs | |
| 614 | + * The buffers from which bytes are to be retrieved | |
| 615 | + * @param offset | |
| 616 | + * The offset within the buffer array of the first buffer from which | |
| 617 | + * bytes are to be retrieved; must be non-negative and no larger | |
| 618 | + * than {@code srcs.length} | |
| 619 | + * @param length | |
| 620 | + * The maximum number of buffers to be accessed; must be non-negative | |
| 621 | + * and no larger than {@code srcs.length - offset} | |
| 622 | + * @param timeout | |
| 623 | + * The maximum time for the I/O operation to complete | |
| 624 | + * @param unit | |
| 625 | + * The time unit of the {@code timeout} argument | |
| 626 | + * @param attachment | |
| 627 | + * The object to attach to the I/O operation; can be {@code null} | |
| 628 | + * @param handler | |
| 629 | + * The handler for consuming the result | |
| 630 | + * | |
| 631 | + * @throws IndexOutOfBoundsException | |
| 632 | + * If the pre-conditions for the {@code offset} and {@code length} | |
| 633 | + * parameter aren't met | |
| 634 | + * @throws WritePendingException | |
| 635 | + * If a write operation is already in progress on this channel | |
| 636 | + * @throws NotYetConnectedException | |
| 637 | + * If this channel is not yet connected | |
| 638 | + * @throws ShutdownChannelGroupException | |
| 639 | + * If the channel group has terminated | |
| 640 | + */ | |
| 641 | + public abstract <A> void write(ByteBuffer[] srcs, | |
| 642 | + int offset, | |
| 643 | + int length, | |
| 644 | + long timeout, | |
| 645 | + TimeUnit unit, | |
| 646 | + A attachment, | |
| 647 | + CompletionHandler<Long,? super A> handler); | |
| 648 | +} | |
Binary file not shown.
| @@ -0,0 +1,45 @@ | ||
| 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 | + | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * A channel that can read and write bytes. This interface simply unifies | |
| 33 | + * {@link ReadableByteChannel} and {@link WritableByteChannel}; it does not | |
| 34 | + * specify any new operations. | |
| 35 | + * | |
| 36 | + * @author Mark Reinhold | |
| 37 | + * @author JSR-51 Expert Group | |
| 38 | + * @since 1.4 | |
| 39 | + */ | |
| 40 | + | |
| 41 | +public interface ByteChannel | |
| 42 | + extends ReadableByteChannel, WritableByteChannel | |
| 43 | +{ | |
| 44 | + | |
| 45 | +} | |
Binary file not shown.
| @@ -0,0 +1,84 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, 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.io.Closeable; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A nexus for I/O operations. | |
| 34 | + * | |
| 35 | + * <p> A channel represents an open connection to an entity such as a hardware | |
| 36 | + * device, a file, a network socket, or a program component that is capable of | |
| 37 | + * performing one or more distinct I/O operations, for example reading or | |
| 38 | + * writing. | |
| 39 | + * | |
| 40 | + * <p> A channel is either open or closed. A channel is open upon creation, | |
| 41 | + * and once closed it remains closed. Once a channel is closed, any attempt to | |
| 42 | + * invoke an I/O operation upon it will cause a {@link ClosedChannelException} | |
| 43 | + * to be thrown. Whether or not a channel is open may be tested by invoking | |
| 44 | + * its {@link #isOpen isOpen} method. | |
| 45 | + * | |
| 46 | + * <p> Channels are, in general, intended to be safe for multithreaded access | |
| 47 | + * as described in the specifications of the interfaces and classes that extend | |
| 48 | + * and implement this interface. | |
| 49 | + * | |
| 50 | + * | |
| 51 | + * @author Mark Reinhold | |
| 52 | + * @author JSR-51 Expert Group | |
| 53 | + * @since 1.4 | |
| 54 | + */ | |
| 55 | + | |
| 56 | +public interface Channel extends Closeable { | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * Tells whether or not this channel is open. </p> | |
| 60 | + * | |
| 61 | + * @return <tt>true</tt> if, and only if, this channel is open | |
| 62 | + */ | |
| 63 | + public boolean isOpen(); | |
| 64 | + | |
| 65 | + /** | |
| 66 | + * Closes this channel. | |
| 67 | + * | |
| 68 | + * <p> After a channel is closed, any further attempt to invoke I/O | |
| 69 | + * operations upon it will cause a {@link ClosedChannelException} to be | |
| 70 | + * thrown. | |
| 71 | + * | |
| 72 | + * <p> If this channel is already closed then invoking this method has no | |
| 73 | + * effect. | |
| 74 | + * | |
| 75 | + * <p> This method may be invoked at any time. If some other thread has | |
| 76 | + * already invoked it, however, then another invocation will block until | |
| 77 | + * the first invocation is complete, after which it will return without | |
| 78 | + * effect. </p> | |
| 79 | + * | |
| 80 | + * @throws IOException If an I/O error occurs | |
| 81 | + */ | |
| 82 | + public void close() throws IOException; | |
| 83 | + | |
| 84 | +} | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,615 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2009, 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.FileInputStream; | |
| 29 | +import java.io.FileOutputStream; | |
| 30 | +import java.io.InputStream; | |
| 31 | +import java.io.OutputStream; | |
| 32 | +import java.io.Reader; | |
| 33 | +import java.io.Writer; | |
| 34 | +import java.io.IOException; | |
| 35 | +import java.nio.ByteBuffer; | |
| 36 | +import java.nio.charset.Charset; | |
| 37 | +import java.nio.charset.CharsetDecoder; | |
| 38 | +import java.nio.charset.CharsetEncoder; | |
| 39 | +import java.nio.charset.UnsupportedCharsetException; | |
| 40 | +import java.nio.channels.spi.AbstractInterruptibleChannel; | |
| 41 | +import java.util.concurrent.ExecutionException; | |
| 42 | +import sun.nio.ch.ChannelInputStream; | |
| 43 | +import sun.nio.cs.StreamDecoder; | |
| 44 | +import sun.nio.cs.StreamEncoder; | |
| 45 | + | |
| 46 | + | |
| 47 | +/** | |
| 48 | + * Utility methods for channels and streams. | |
| 49 | + * | |
| 50 | + * <p> This class defines static methods that support the interoperation of the | |
| 51 | + * stream classes of the <tt>{@link java.io}</tt> package with the channel | |
| 52 | + * classes of this package. </p> | |
| 53 | + * | |
| 54 | + * | |
| 55 | + * @author Mark Reinhold | |
| 56 | + * @author Mike McCloskey | |
| 57 | + * @author JSR-51 Expert Group | |
| 58 | + * @since 1.4 | |
| 59 | + */ | |
| 60 | + | |
| 61 | +public final class Channels { | |
| 62 | + | |
| 63 | + private Channels() { } // No instantiation | |
| 64 | + | |
| 65 | + private static void checkNotNull(Object o, String name) { | |
| 66 | + if (o == null) | |
| 67 | + throw new NullPointerException("\"" + name + "\" is null!"); | |
| 68 | + } | |
| 69 | + | |
| 70 | + /** | |
| 71 | + * Write all remaining bytes in buffer to the given channel. | |
| 72 | + * If the channel is selectable then it must be configured blocking. | |
| 73 | + */ | |
| 74 | + private static void writeFullyImpl(WritableByteChannel ch, ByteBuffer bb) | |
| 75 | + throws IOException | |
| 76 | + { | |
| 77 | + while (bb.remaining() > 0) { | |
| 78 | + int n = ch.write(bb); | |
| 79 | + if (n <= 0) | |
| 80 | + throw new RuntimeException("no bytes written"); | |
| 81 | + } | |
| 82 | + } | |
| 83 | + | |
| 84 | + /** | |
| 85 | + * Write all remaining bytes in buffer to the given channel. | |
| 86 | + * | |
| 87 | + * @throws IllegalBlockingException | |
| 88 | + * If the channel is selectable and configured non-blocking. | |
| 89 | + */ | |
| 90 | + private static void writeFully(WritableByteChannel ch, ByteBuffer bb) | |
| 91 | + throws IOException | |
| 92 | + { | |
| 93 | + if (ch instanceof SelectableChannel) { | |
| 94 | + SelectableChannel sc = (SelectableChannel)ch; | |
| 95 | + synchronized (sc.blockingLock()) { | |
| 96 | + if (!sc.isBlocking()) | |
| 97 | + throw new IllegalBlockingModeException(); | |
| 98 | + writeFullyImpl(ch, bb); | |
| 99 | + } | |
| 100 | + } else { | |
| 101 | + writeFullyImpl(ch, bb); | |
| 102 | + } | |
| 103 | + } | |
| 104 | + | |
| 105 | + // -- Byte streams from channels -- | |
| 106 | + | |
| 107 | + /** | |
| 108 | + * Constructs a stream that reads bytes from the given channel. | |
| 109 | + * | |
| 110 | + * <p> The <tt>read</tt> methods of the resulting stream will throw an | |
| 111 | + * {@link IllegalBlockingModeException} if invoked while the underlying | |
| 112 | + * channel is in non-blocking mode. The stream will not be buffered, and | |
| 113 | + * it will not support the {@link InputStream#mark mark} or {@link | |
| 114 | + * InputStream#reset reset} methods. The stream will be safe for access by | |
| 115 | + * multiple concurrent threads. Closing the stream will in turn cause the | |
| 116 | + * channel to be closed. </p> | |
| 117 | + * | |
| 118 | + * @param ch | |
| 119 | + * The channel from which bytes will be read | |
| 120 | + * | |
| 121 | + * @return A new input stream | |
| 122 | + */ | |
| 123 | + public static InputStream newInputStream(ReadableByteChannel ch) { | |
| 124 | + checkNotNull(ch, "ch"); | |
| 125 | + return new sun.nio.ch.ChannelInputStream(ch); | |
| 126 | + } | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Constructs a stream that writes bytes to the given channel. | |
| 130 | + * | |
| 131 | + * <p> The <tt>write</tt> methods of the resulting stream will throw an | |
| 132 | + * {@link IllegalBlockingModeException} if invoked while the underlying | |
| 133 | + * channel is in non-blocking mode. The stream will not be buffered. The | |
| 134 | + * stream will be safe for access by multiple concurrent threads. Closing | |
| 135 | + * the stream will in turn cause the channel to be closed. </p> | |
| 136 | + * | |
| 137 | + * @param ch | |
| 138 | + * The channel to which bytes will be written | |
| 139 | + * | |
| 140 | + * @return A new output stream | |
| 141 | + */ | |
| 142 | + public static OutputStream newOutputStream(final WritableByteChannel ch) { | |
| 143 | + checkNotNull(ch, "ch"); | |
| 144 | + | |
| 145 | + return new OutputStream() { | |
| 146 | + | |
| 147 | + private ByteBuffer bb = null; | |
| 148 | + private byte[] bs = null; // Invoker's previous array | |
| 149 | + private byte[] b1 = null; | |
| 150 | + | |
| 151 | + public synchronized void write(int b) throws IOException { | |
| 152 | + if (b1 == null) | |
| 153 | + b1 = new byte[1]; | |
| 154 | + b1[0] = (byte)b; | |
| 155 | + this.write(b1); | |
| 156 | + } | |
| 157 | + | |
| 158 | + public synchronized void write(byte[] bs, int off, int len) | |
| 159 | + throws IOException | |
| 160 | + { | |
| 161 | + if ((off < 0) || (off > bs.length) || (len < 0) || | |
| 162 | + ((off + len) > bs.length) || ((off + len) < 0)) { | |
| 163 | + throw new IndexOutOfBoundsException(); | |
| 164 | + } else if (len == 0) { | |
| 165 | + return; | |
| 166 | + } | |
| 167 | + ByteBuffer bb = ((this.bs == bs) | |
| 168 | + ? this.bb | |
| 169 | + : ByteBuffer.wrap(bs)); | |
| 170 | + bb.limit(Math.min(off + len, bb.capacity())); | |
| 171 | + bb.position(off); | |
| 172 | + this.bb = bb; | |
| 173 | + this.bs = bs; | |
| 174 | + Channels.writeFully(ch, bb); | |
| 175 | + } | |
| 176 | + | |
| 177 | + public void close() throws IOException { | |
| 178 | + ch.close(); | |
| 179 | + } | |
| 180 | + | |
| 181 | + }; | |
| 182 | + } | |
| 183 | + | |
| 184 | + /** | |
| 185 | + * Constructs a stream that reads bytes from the given channel. | |
| 186 | + * | |
| 187 | + * <p> The stream will not be buffered, and it will not support the {@link | |
| 188 | + * InputStream#mark mark} or {@link InputStream#reset reset} methods. The | |
| 189 | + * stream will be safe for access by multiple concurrent threads. Closing | |
| 190 | + * the stream will in turn cause the channel to be closed. </p> | |
| 191 | + * | |
| 192 | + * @param ch | |
| 193 | + * The channel from which bytes will be read | |
| 194 | + * | |
| 195 | + * @return A new input stream | |
| 196 | + * | |
| 197 | + * @since 1.7 | |
| 198 | + */ | |
| 199 | + public static InputStream newInputStream(final AsynchronousByteChannel ch) { | |
| 200 | + checkNotNull(ch, "ch"); | |
| 201 | + return new InputStream() { | |
| 202 | + | |
| 203 | + private ByteBuffer bb = null; | |
| 204 | + private byte[] bs = null; // Invoker's previous array | |
| 205 | + private byte[] b1 = null; | |
| 206 | + | |
| 207 | + @Override | |
| 208 | + public synchronized int read() throws IOException { | |
| 209 | + if (b1 == null) | |
| 210 | + b1 = new byte[1]; | |
| 211 | + int n = this.read(b1); | |
| 212 | + if (n == 1) | |
| 213 | + return b1[0] & 0xff; | |
| 214 | + return -1; | |
| 215 | + } | |
| 216 | + | |
| 217 | + @Override | |
| 218 | + public synchronized int read(byte[] bs, int off, int len) | |
| 219 | + throws IOException | |
| 220 | + { | |
| 221 | + if ((off < 0) || (off > bs.length) || (len < 0) || | |
| 222 | + ((off + len) > bs.length) || ((off + len) < 0)) { | |
| 223 | + throw new IndexOutOfBoundsException(); | |
| 224 | + } else if (len == 0) | |
| 225 | + return 0; | |
| 226 | + | |
| 227 | + ByteBuffer bb = ((this.bs == bs) | |
| 228 | + ? this.bb | |
| 229 | + : ByteBuffer.wrap(bs)); | |
| 230 | + bb.position(off); | |
| 231 | + bb.limit(Math.min(off + len, bb.capacity())); | |
| 232 | + this.bb = bb; | |
| 233 | + this.bs = bs; | |
| 234 | + | |
| 235 | + boolean interrupted = false; | |
| 236 | + try { | |
| 237 | + for (;;) { | |
| 238 | + try { | |
| 239 | + return ch.read(bb).get(); | |
| 240 | + } catch (ExecutionException ee) { | |
| 241 | + throw new IOException(ee.getCause()); | |
| 242 | + } catch (InterruptedException ie) { | |
| 243 | + interrupted = true; | |
| 244 | + } | |
| 245 | + } | |
| 246 | + } finally { | |
| 247 | + if (interrupted) | |
| 248 | + Thread.currentThread().interrupt(); | |
| 249 | + } | |
| 250 | + } | |
| 251 | + | |
| 252 | + @Override | |
| 253 | + public void close() throws IOException { | |
| 254 | + ch.close(); | |
| 255 | + } | |
| 256 | + }; | |
| 257 | + } | |
| 258 | + | |
| 259 | + /** | |
| 260 | + * Constructs a stream that writes bytes to the given channel. | |
| 261 | + * | |
| 262 | + * <p> The stream will not be buffered. The stream will be safe for access | |
| 263 | + * by multiple concurrent threads. Closing the stream will in turn cause | |
| 264 | + * the channel to be closed. </p> | |
| 265 | + * | |
| 266 | + * @param ch | |
| 267 | + * The channel to which bytes will be written | |
| 268 | + * | |
| 269 | + * @return A new output stream | |
| 270 | + * | |
| 271 | + * @since 1.7 | |
| 272 | + */ | |
| 273 | + public static OutputStream newOutputStream(final AsynchronousByteChannel ch) { | |
| 274 | + checkNotNull(ch, "ch"); | |
| 275 | + return new OutputStream() { | |
| 276 | + | |
| 277 | + private ByteBuffer bb = null; | |
| 278 | + private byte[] bs = null; // Invoker's previous array | |
| 279 | + private byte[] b1 = null; | |
| 280 | + | |
| 281 | + @Override | |
| 282 | + public synchronized void write(int b) throws IOException { | |
| 283 | + if (b1 == null) | |
| 284 | + b1 = new byte[1]; | |
| 285 | + b1[0] = (byte)b; | |
| 286 | + this.write(b1); | |
| 287 | + } | |
| 288 | + | |
| 289 | + @Override | |
| 290 | + public synchronized void write(byte[] bs, int off, int len) | |
| 291 | + throws IOException | |
| 292 | + { | |
| 293 | + if ((off < 0) || (off > bs.length) || (len < 0) || | |
| 294 | + ((off + len) > bs.length) || ((off + len) < 0)) { | |
| 295 | + throw new IndexOutOfBoundsException(); | |
| 296 | + } else if (len == 0) { | |
| 297 | + return; | |
| 298 | + } | |
| 299 | + ByteBuffer bb = ((this.bs == bs) | |
| 300 | + ? this.bb | |
| 301 | + : ByteBuffer.wrap(bs)); | |
| 302 | + bb.limit(Math.min(off + len, bb.capacity())); | |
| 303 | + bb.position(off); | |
| 304 | + this.bb = bb; | |
| 305 | + this.bs = bs; | |
| 306 | + | |
| 307 | + boolean interrupted = false; | |
| 308 | + try { | |
| 309 | + while (bb.remaining() > 0) { | |
| 310 | + try { | |
| 311 | + ch.write(bb).get(); | |
| 312 | + } catch (ExecutionException ee) { | |
| 313 | + throw new IOException(ee.getCause()); | |
| 314 | + } catch (InterruptedException ie) { | |
| 315 | + interrupted = true; | |
| 316 | + } | |
| 317 | + } | |
| 318 | + } finally { | |
| 319 | + if (interrupted) | |
| 320 | + Thread.currentThread().interrupt(); | |
| 321 | + } | |
| 322 | + } | |
| 323 | + | |
| 324 | + @Override | |
| 325 | + public void close() throws IOException { | |
| 326 | + ch.close(); | |
| 327 | + } | |
| 328 | + }; | |
| 329 | + } | |
| 330 | + | |
| 331 | + | |
| 332 | + // -- Channels from streams -- | |
| 333 | + | |
| 334 | + /** | |
| 335 | + * Constructs a channel that reads bytes from the given stream. | |
| 336 | + * | |
| 337 | + * <p> The resulting channel will not be buffered; it will simply redirect | |
| 338 | + * its I/O operations to the given stream. Closing the channel will in | |
| 339 | + * turn cause the stream to be closed. </p> | |
| 340 | + * | |
| 341 | + * @param in | |
| 342 | + * The stream from which bytes are to be read | |
| 343 | + * | |
| 344 | + * @return A new readable byte channel | |
| 345 | + */ | |
| 346 | + public static ReadableByteChannel newChannel(final InputStream in) { | |
| 347 | + checkNotNull(in, "in"); | |
| 348 | + | |
| 349 | + if (in instanceof FileInputStream && | |
| 350 | + FileInputStream.class.equals(in.getClass())) { | |
| 351 | + return ((FileInputStream)in).getChannel(); | |
| 352 | + } | |
| 353 | + | |
| 354 | + return new ReadableByteChannelImpl(in); | |
| 355 | + } | |
| 356 | + | |
| 357 | + private static class ReadableByteChannelImpl | |
| 358 | + extends AbstractInterruptibleChannel // Not really interruptible | |
| 359 | + implements ReadableByteChannel | |
| 360 | + { | |
| 361 | + InputStream in; | |
| 362 | + private static final int TRANSFER_SIZE = 8192; | |
| 363 | + private byte buf[] = new byte[0]; | |
| 364 | + private boolean open = true; | |
| 365 | + private Object readLock = new Object(); | |
| 366 | + | |
| 367 | + ReadableByteChannelImpl(InputStream in) { | |
| 368 | + this.in = in; | |
| 369 | + } | |
| 370 | + | |
| 371 | + public int read(ByteBuffer dst) throws IOException { | |
| 372 | + int len = dst.remaining(); | |
| 373 | + int totalRead = 0; | |
| 374 | + int bytesRead = 0; | |
| 375 | + synchronized (readLock) { | |
| 376 | + while (totalRead < len) { | |
| 377 | + int bytesToRead = Math.min((len - totalRead), | |
| 378 | + TRANSFER_SIZE); | |
| 379 | + if (buf.length < bytesToRead) | |
| 380 | + buf = new byte[bytesToRead]; | |
| 381 | + if ((totalRead > 0) && !(in.available() > 0)) | |
| 382 | + break; // block at most once | |
| 383 | + try { | |
| 384 | + begin(); | |
| 385 | + bytesRead = in.read(buf, 0, bytesToRead); | |
| 386 | + } finally { | |
| 387 | + end(bytesRead > 0); | |
| 388 | + } | |
| 389 | + if (bytesRead < 0) | |
| 390 | + break; | |
| 391 | + else | |
| 392 | + totalRead += bytesRead; | |
| 393 | + dst.put(buf, 0, bytesRead); | |
| 394 | + } | |
| 395 | + if ((bytesRead < 0) && (totalRead == 0)) | |
| 396 | + return -1; | |
| 397 | + | |
| 398 | + return totalRead; | |
| 399 | + } | |
| 400 | + } | |
| 401 | + | |
| 402 | + protected void implCloseChannel() throws IOException { | |
| 403 | + in.close(); | |
| 404 | + open = false; | |
| 405 | + } | |
| 406 | + } | |
| 407 | + | |
| 408 | + | |
| 409 | + /** | |
| 410 | + * Constructs a channel that writes bytes to the given stream. | |
| 411 | + * | |
| 412 | + * <p> The resulting channel will not be buffered; it will simply redirect | |
| 413 | + * its I/O operations to the given stream. Closing the channel will in | |
| 414 | + * turn cause the stream to be closed. </p> | |
| 415 | + * | |
| 416 | + * @param out | |
| 417 | + * The stream to which bytes are to be written | |
| 418 | + * | |
| 419 | + * @return A new writable byte channel | |
| 420 | + */ | |
| 421 | + public static WritableByteChannel newChannel(final OutputStream out) { | |
| 422 | + checkNotNull(out, "out"); | |
| 423 | + | |
| 424 | + if (out instanceof FileOutputStream && | |
| 425 | + FileOutputStream.class.equals(out.getClass())) { | |
| 426 | + return ((FileOutputStream)out).getChannel(); | |
| 427 | + } | |
| 428 | + | |
| 429 | + return new WritableByteChannelImpl(out); | |
| 430 | + } | |
| 431 | + | |
| 432 | + private static class WritableByteChannelImpl | |
| 433 | + extends AbstractInterruptibleChannel // Not really interruptible | |
| 434 | + implements WritableByteChannel | |
| 435 | + { | |
| 436 | + OutputStream out; | |
| 437 | + private static final int TRANSFER_SIZE = 8192; | |
| 438 | + private byte buf[] = new byte[0]; | |
| 439 | + private boolean open = true; | |
| 440 | + private Object writeLock = new Object(); | |
| 441 | + | |
| 442 | + WritableByteChannelImpl(OutputStream out) { | |
| 443 | + this.out = out; | |
| 444 | + } | |
| 445 | + | |
| 446 | + public int write(ByteBuffer src) throws IOException { | |
| 447 | + int len = src.remaining(); | |
| 448 | + int totalWritten = 0; | |
| 449 | + synchronized (writeLock) { | |
| 450 | + while (totalWritten < len) { | |
| 451 | + int bytesToWrite = Math.min((len - totalWritten), | |
| 452 | + TRANSFER_SIZE); | |
| 453 | + if (buf.length < bytesToWrite) | |
| 454 | + buf = new byte[bytesToWrite]; | |
| 455 | + src.get(buf, 0, bytesToWrite); | |
| 456 | + try { | |
| 457 | + begin(); | |
| 458 | + out.write(buf, 0, bytesToWrite); | |
| 459 | + } finally { | |
| 460 | + end(bytesToWrite > 0); | |
| 461 | + } | |
| 462 | + totalWritten += bytesToWrite; | |
| 463 | + } | |
| 464 | + return totalWritten; | |
| 465 | + } | |
| 466 | + } | |
| 467 | + | |
| 468 | + protected void implCloseChannel() throws IOException { | |
| 469 | + out.close(); | |
| 470 | + open = false; | |
| 471 | + } | |
| 472 | + } | |
| 473 | + | |
| 474 | + | |
| 475 | + // -- Character streams from channels -- | |
| 476 | + | |
| 477 | + /** | |
| 478 | + * Constructs a reader that decodes bytes from the given channel using the | |
| 479 | + * given decoder. | |
| 480 | + * | |
| 481 | + * <p> The resulting stream will contain an internal input buffer of at | |
| 482 | + * least <tt>minBufferCap</tt> bytes. The stream's <tt>read</tt> methods | |
| 483 | + * will, as needed, fill the buffer by reading bytes from the underlying | |
| 484 | + * channel; if the channel is in non-blocking mode when bytes are to be | |
| 485 | + * read then an {@link IllegalBlockingModeException} will be thrown. The | |
| 486 | + * resulting stream will not otherwise be buffered, and it will not support | |
| 487 | + * the {@link Reader#mark mark} or {@link Reader#reset reset} methods. | |
| 488 | + * Closing the stream will in turn cause the channel to be closed. </p> | |
| 489 | + * | |
| 490 | + * @param ch | |
| 491 | + * The channel from which bytes will be read | |
| 492 | + * | |
| 493 | + * @param dec | |
| 494 | + * The charset decoder to be used | |
| 495 | + * | |
| 496 | + * @param minBufferCap | |
| 497 | + * The minimum capacity of the internal byte buffer, | |
| 498 | + * or <tt>-1</tt> if an implementation-dependent | |
| 499 | + * default capacity is to be used | |
| 500 | + * | |
| 501 | + * @return A new reader | |
| 502 | + */ | |
| 503 | + public static Reader newReader(ReadableByteChannel ch, | |
| 504 | + CharsetDecoder dec, | |
| 505 | + int minBufferCap) | |
| 506 | + { | |
| 507 | + checkNotNull(ch, "ch"); | |
| 508 | + return StreamDecoder.forDecoder(ch, dec.reset(), minBufferCap); | |
| 509 | + } | |
| 510 | + | |
| 511 | + /** | |
| 512 | + * Constructs a reader that decodes bytes from the given channel according | |
| 513 | + * to the named charset. | |
| 514 | + * | |
| 515 | + * <p> An invocation of this method of the form | |
| 516 | + * | |
| 517 | + * <blockquote><pre> | |
| 518 | + * Channels.newReader(ch, csname)</pre></blockquote> | |
| 519 | + * | |
| 520 | + * behaves in exactly the same way as the expression | |
| 521 | + * | |
| 522 | + * <blockquote><pre> | |
| 523 | + * Channels.newReader(ch, | |
| 524 | + * Charset.forName(csName) | |
| 525 | + * .newDecoder(), | |
| 526 | + * -1);</pre></blockquote> | |
| 527 | + * | |
| 528 | + * @param ch | |
| 529 | + * The channel from which bytes will be read | |
| 530 | + * | |
| 531 | + * @param csName | |
| 532 | + * The name of the charset to be used | |
| 533 | + * | |
| 534 | + * @return A new reader | |
| 535 | + * | |
| 536 | + * @throws UnsupportedCharsetException | |
| 537 | + * If no support for the named charset is available | |
| 538 | + * in this instance of the Java virtual machine | |
| 539 | + */ | |
| 540 | + public static Reader newReader(ReadableByteChannel ch, | |
| 541 | + String csName) | |
| 542 | + { | |
| 543 | + checkNotNull(csName, "csName"); | |
| 544 | + return newReader(ch, Charset.forName(csName).newDecoder(), -1); | |
| 545 | + } | |
| 546 | + | |
| 547 | + /** | |
| 548 | + * Constructs a writer that encodes characters using the given encoder and | |
| 549 | + * writes the resulting bytes to the given channel. | |
| 550 | + * | |
| 551 | + * <p> The resulting stream will contain an internal output buffer of at | |
| 552 | + * least <tt>minBufferCap</tt> bytes. The stream's <tt>write</tt> methods | |
| 553 | + * will, as needed, flush the buffer by writing bytes to the underlying | |
| 554 | + * channel; if the channel is in non-blocking mode when bytes are to be | |
| 555 | + * written then an {@link IllegalBlockingModeException} will be thrown. | |
| 556 | + * The resulting stream will not otherwise be buffered. Closing the stream | |
| 557 | + * will in turn cause the channel to be closed. </p> | |
| 558 | + * | |
| 559 | + * @param ch | |
| 560 | + * The channel to which bytes will be written | |
| 561 | + * | |
| 562 | + * @param enc | |
| 563 | + * The charset encoder to be used | |
| 564 | + * | |
| 565 | + * @param minBufferCap | |
| 566 | + * The minimum capacity of the internal byte buffer, | |
| 567 | + * or <tt>-1</tt> if an implementation-dependent | |
| 568 | + * default capacity is to be used | |
| 569 | + * | |
| 570 | + * @return A new writer | |
| 571 | + */ | |
| 572 | + public static Writer newWriter(final WritableByteChannel ch, | |
| 573 | + final CharsetEncoder enc, | |
| 574 | + final int minBufferCap) | |
| 575 | + { | |
| 576 | + checkNotNull(ch, "ch"); | |
| 577 | + return StreamEncoder.forEncoder(ch, enc.reset(), minBufferCap); | |
| 578 | + } | |
| 579 | + | |
| 580 | + /** | |
| 581 | + * Constructs a writer that encodes characters according to the named | |
| 582 | + * charset and writes the resulting bytes to the given channel. | |
| 583 | + * | |
| 584 | + * <p> An invocation of this method of the form | |
| 585 | + * | |
| 586 | + * <blockquote><pre> | |
| 587 | + * Channels.newWriter(ch, csname)</pre></blockquote> | |
| 588 | + * | |
| 589 | + * behaves in exactly the same way as the expression | |
| 590 | + * | |
| 591 | + * <blockquote><pre> | |
| 592 | + * Channels.newWriter(ch, | |
| 593 | + * Charset.forName(csName) | |
| 594 | + * .newEncoder(), | |
| 595 | + * -1);</pre></blockquote> | |
| 596 | + * | |
| 597 | + * @param ch | |
| 598 | + * The channel to which bytes will be written | |
| 599 | + * | |
| 600 | + * @param csName | |
| 601 | + * The name of the charset to be used | |
| 602 | + * | |
| 603 | + * @return A new writer | |
| 604 | + * | |
| 605 | + * @throws UnsupportedCharsetException | |
| 606 | + * If no support for the named charset is available | |
| 607 | + * in this instance of the Java virtual machine | |
| 608 | + */ | |
| 609 | + public static Writer newWriter(WritableByteChannel ch, | |
| 610 | + String csName) | |
| 611 | + { | |
| 612 | + checkNotNull(csName, "csName"); | |
| 613 | + return newWriter(ch, Charset.forName(csName).newEncoder(), -1); | |
| 614 | + } | |
| 615 | +} | |
Binary file not shown.
| @@ -0,0 +1,66 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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 | +/** | |
| 29 | + * A handler for consuming the result of an asynchronous I/O operation. | |
| 30 | + * | |
| 31 | + * <p> The asynchronous channels defined in this package allow a completion | |
| 32 | + * handler to be specified to consume the result of an asynchronous operation. | |
| 33 | + * The {@link #completed completed} method is invoked when the I/O operation | |
| 34 | + * completes successfully. The {@link #failed failed} method is invoked if the | |
| 35 | + * I/O operations fails. The implementations of these methods should complete | |
| 36 | + * in a timely manner so as to avoid keeping the invoking thread from dispatching | |
| 37 | + * to other completion handlers. | |
| 38 | + * | |
| 39 | + * @param <V> The result type of the I/O operation | |
| 40 | + * @param <A> The type of the object attached to the I/O operation | |
| 41 | + * | |
| 42 | + * @since 1.7 | |
| 43 | + */ | |
| 44 | + | |
| 45 | +public interface CompletionHandler<V,A> { | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Invoked when an operation has completed. | |
| 49 | + * | |
| 50 | + * @param result | |
| 51 | + * The result of the I/O operation. | |
| 52 | + * @param attachment | |
| 53 | + * The object attached to the I/O operation when it was initiated. | |
| 54 | + */ | |
| 55 | + void completed(V result, A attachment); | |
| 56 | + | |
| 57 | + /** | |
| 58 | + * Invoked when an operation fails. | |
| 59 | + * | |
| 60 | + * @param exc | |
| 61 | + * The exception to indicate why the I/O operation failed | |
| 62 | + * @param attachment | |
| 63 | + * The object attached to the I/O operation when it was initiated. | |
| 64 | + */ | |
| 65 | + void failed(Throwable exc, A attachment); | |
| 66 | +} | |
Binary file not shown.
| @@ -0,0 +1,568 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2009, 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.net.ProtocolFamily; | |
| 30 | +import java.net.DatagramSocket; | |
| 31 | +import java.net.SocketOption; | |
| 32 | +import java.net.SocketAddress; | |
| 33 | +import java.nio.ByteBuffer; | |
| 34 | +import java.nio.channels.spi.AbstractSelectableChannel; | |
| 35 | +import java.nio.channels.spi.SelectorProvider; | |
| 36 | + | |
| 37 | +/** | |
| 38 | + * A selectable channel for datagram-oriented sockets. | |
| 39 | + * | |
| 40 | + * <p> A datagram channel is created by invoking one of the {@link #open open} methods | |
| 41 | + * of this class. It is not possible to create a channel for an arbitrary, | |
| 42 | + * pre-existing datagram socket. A newly-created datagram channel is open but not | |
| 43 | + * connected. A datagram channel need not be connected in order for the {@link #send | |
| 44 | + * send} and {@link #receive receive} methods to be used. A datagram channel may be | |
| 45 | + * connected, by invoking its {@link #connect connect} method, in order to | |
| 46 | + * avoid the overhead of the security checks are otherwise performed as part of | |
| 47 | + * every send and receive operation. A datagram channel must be connected in | |
| 48 | + * order to use the {@link #read(java.nio.ByteBuffer) read} and {@link | |
| 49 | + * #write(java.nio.ByteBuffer) write} methods, since those methods do not | |
| 50 | + * accept or return socket addresses. | |
| 51 | + * | |
| 52 | + * <p> Once connected, a datagram channel remains connected until it is | |
| 53 | + * disconnected or closed. Whether or not a datagram channel is connected may | |
| 54 | + * be determined by invoking its {@link #isConnected isConnected} method. | |
| 55 | + * | |
| 56 | + * <p> Socket options are configured using the {@link #setOption(SocketOption,Object) | |
| 57 | + * setOption} method. A datagram channel to an Internet Protocol socket supports | |
| 58 | + * the following options: | |
| 59 | + * <blockquote> | |
| 60 | + * <table border> | |
| 61 | + * <tr> | |
| 62 | + * <th>Option Name</th> | |
| 63 | + * <th>Description</th> | |
| 64 | + * </tr> | |
| 65 | + * <tr> | |
| 66 | + * <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td> | |
| 67 | + * <td> The size of the socket send buffer </td> | |
| 68 | + * </tr> | |
| 69 | + * <tr> | |
| 70 | + * <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td> | |
| 71 | + * <td> The size of the socket receive buffer </td> | |
| 72 | + * </tr> | |
| 73 | + * <tr> | |
| 74 | + * <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td> | |
| 75 | + * <td> Re-use address </td> | |
| 76 | + * </tr> | |
| 77 | + * <tr> | |
| 78 | + * <td> {@link java.net.StandardSocketOptions#SO_BROADCAST SO_BROADCAST} </td> | |
| 79 | + * <td> Allow transmission of broadcast datagrams </td> | |
| 80 | + * </tr> | |
| 81 | + * <tr> | |
| 82 | + * <td> {@link java.net.StandardSocketOptions#IP_TOS IP_TOS} </td> | |
| 83 | + * <td> The Type of Service (ToS) octet in the Internet Protocol (IP) header </td> | |
| 84 | + * </tr> | |
| 85 | + * <tr> | |
| 86 | + * <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_IF IP_MULTICAST_IF} </td> | |
| 87 | + * <td> The network interface for Internet Protocol (IP) multicast datagrams </td> | |
| 88 | + * </tr> | |
| 89 | + * <tr> | |
| 90 | + * <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_TTL | |
| 91 | + * IP_MULTICAST_TTL} </td> | |
| 92 | + * <td> The <em>time-to-live</em> for Internet Protocol (IP) multicast | |
| 93 | + * datagrams </td> | |
| 94 | + * </tr> | |
| 95 | + * <tr> | |
| 96 | + * <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_LOOP | |
| 97 | + * IP_MULTICAST_LOOP} </td> | |
| 98 | + * <td> Loopback for Internet Protocol (IP) multicast datagrams </td> | |
| 99 | + * </tr> | |
| 100 | + * </table> | |
| 101 | + * </blockquote> | |
| 102 | + * Additional (implementation specific) options may also be supported. | |
| 103 | + * | |
| 104 | + * <p> Datagram channels are safe for use by multiple concurrent threads. They | |
| 105 | + * support concurrent reading and writing, though at most one thread may be | |
| 106 | + * reading and at most one thread may be writing at any given time. </p> | |
| 107 | + * | |
| 108 | + * @author Mark Reinhold | |
| 109 | + * @author JSR-51 Expert Group | |
| 110 | + * @since 1.4 | |
| 111 | + */ | |
| 112 | + | |
| 113 | +public abstract class DatagramChannel | |
| 114 | + extends AbstractSelectableChannel | |
| 115 | + implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel | |
| 116 | +{ | |
| 117 | + | |
| 118 | + /** | |
| 119 | + * Initializes a new instance of this class. | |
| 120 | + */ | |
| 121 | + protected DatagramChannel(SelectorProvider provider) { | |
| 122 | + super(provider); | |
| 123 | + } | |
| 124 | + | |
| 125 | + /** | |
| 126 | + * Opens a datagram channel. | |
| 127 | + * | |
| 128 | + * <p> The new channel is created by invoking the {@link | |
| 129 | + * java.nio.channels.spi.SelectorProvider#openDatagramChannel() | |
| 130 | + * openDatagramChannel} method of the system-wide default {@link | |
| 131 | + * java.nio.channels.spi.SelectorProvider} object. The channel will not be | |
| 132 | + * connected. | |
| 133 | + * | |
| 134 | + * <p> The {@link ProtocolFamily ProtocolFamily} of the channel's socket | |
| 135 | + * is platform (and possibly configuration) dependent and therefore unspecified. | |
| 136 | + * The {@link #open(ProtocolFamily) open} allows the protocol family to be | |
| 137 | + * selected when opening a datagram channel, and should be used to open | |
| 138 | + * datagram channels that are intended for Internet Protocol multicasting. | |
| 139 | + * | |
| 140 | + * @return A new datagram channel | |
| 141 | + * | |
| 142 | + * @throws IOException | |
| 143 | + * If an I/O error occurs | |
| 144 | + */ | |
| 145 | + public static DatagramChannel open() throws IOException { | |
| 146 | + return SelectorProvider.provider().openDatagramChannel(); | |
| 147 | + } | |
| 148 | + | |
| 149 | + /** | |
| 150 | + * Opens a datagram channel. | |
| 151 | + * | |
| 152 | + * <p> The {@code family} parameter is used to specify the {@link | |
| 153 | + * ProtocolFamily}. If the datagram channel is to be used for IP multicasing | |
| 154 | + * then this should correspond to the address type of the multicast groups | |
| 155 | + * that this channel will join. | |
| 156 | + * | |
| 157 | + * <p> The new channel is created by invoking the {@link | |
| 158 | + * java.nio.channels.spi.SelectorProvider#openDatagramChannel(ProtocolFamily) | |
| 159 | + * openDatagramChannel} method of the system-wide default {@link | |
| 160 | + * java.nio.channels.spi.SelectorProvider} object. The channel will not be | |
| 161 | + * connected. | |
| 162 | + * | |
| 163 | + * @param family | |
| 164 | + * The protocol family | |
| 165 | + * | |
| 166 | + * @return A new datagram channel | |
| 167 | + * | |
| 168 | + * @throws UnsupportedOperationException | |
| 169 | + * If the specified protocol family is not supported. For example, | |
| 170 | + * suppose the parameter is specified as {@link | |
| 171 | + * java.net.StandardProtocolFamily#INET6 StandardProtocolFamily.INET6} | |
| 172 | + * but IPv6 is not enabled on the platform. | |
| 173 | + * @throws IOException | |
| 174 | + * If an I/O error occurs | |
| 175 | + * | |
| 176 | + * @since 1.7 | |
| 177 | + */ | |
| 178 | + public static DatagramChannel open(ProtocolFamily family) throws IOException { | |
| 179 | + return SelectorProvider.provider().openDatagramChannel(family); | |
| 180 | + } | |
| 181 | + | |
| 182 | + /** | |
| 183 | + * Returns an operation set identifying this channel's supported | |
| 184 | + * operations. | |
| 185 | + * | |
| 186 | + * <p> Datagram channels support reading and writing, so this method | |
| 187 | + * returns <tt>(</tt>{@link SelectionKey#OP_READ} <tt>|</tt> {@link | |
| 188 | + * SelectionKey#OP_WRITE}<tt>)</tt>. </p> | |
| 189 | + * | |
| 190 | + * @return The valid-operation set | |
| 191 | + */ | |
| 192 | + public final int validOps() { | |
| 193 | + return (SelectionKey.OP_READ | |
| 194 | + | SelectionKey.OP_WRITE); | |
| 195 | + } | |
| 196 | + | |
| 197 | + | |
| 198 | + // -- Socket-specific operations -- | |
| 199 | + | |
| 200 | + /** | |
| 201 | + * @throws AlreadyBoundException {@inheritDoc} | |
| 202 | + * @throws UnsupportedAddressTypeException {@inheritDoc} | |
| 203 | + * @throws ClosedChannelException {@inheritDoc} | |
| 204 | + * @throws IOException {@inheritDoc} | |
| 205 | + * @throws SecurityException | |
| 206 | + * If a security manager has been installed and its {@link | |
| 207 | + * SecurityManager#checkListen checkListen} method denies the | |
| 208 | + * operation | |
| 209 | + * | |
| 210 | + * @since 1.7 | |
| 211 | + */ | |
| 212 | + public abstract DatagramChannel bind(SocketAddress local) | |
| 213 | + throws IOException; | |
| 214 | + | |
| 215 | + /** | |
| 216 | + * @throws UnsupportedOperationException {@inheritDoc} | |
| 217 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 218 | + * @throws ClosedChannelException {@inheritDoc} | |
| 219 | + * @throws IOException {@inheritDoc} | |
| 220 | + * | |
| 221 | + * @since 1.7 | |
| 222 | + */ | |
| 223 | + public abstract <T> DatagramChannel setOption(SocketOption<T> name, T value) | |
| 224 | + throws IOException; | |
| 225 | + | |
| 226 | + /** | |
| 227 | + * Retrieves a datagram socket associated with this channel. | |
| 228 | + * | |
| 229 | + * <p> The returned object will not declare any public methods that are not | |
| 230 | + * declared in the {@link java.net.DatagramSocket} class. </p> | |
| 231 | + * | |
| 232 | + * @return A datagram socket associated with this channel | |
| 233 | + */ | |
| 234 | + public abstract DatagramSocket socket(); | |
| 235 | + | |
| 236 | + /** | |
| 237 | + * Tells whether or not this channel's socket is connected. | |
| 238 | + * | |
| 239 | + * @return {@code true} if, and only if, this channel's socket | |
| 240 | + * is {@link #isOpen open} and connected | |
| 241 | + */ | |
| 242 | + public abstract boolean isConnected(); | |
| 243 | + | |
| 244 | + /** | |
| 245 | + * Connects this channel's socket. | |
| 246 | + * | |
| 247 | + * <p> The channel's socket is configured so that it only receives | |
| 248 | + * datagrams from, and sends datagrams to, the given remote <i>peer</i> | |
| 249 | + * address. Once connected, datagrams may not be received from or sent to | |
| 250 | + * any other address. A datagram socket remains connected until it is | |
| 251 | + * explicitly disconnected or until it is closed. | |
| 252 | + * | |
| 253 | + * <p> This method performs exactly the same security checks as the {@link | |
| 254 | + * java.net.DatagramSocket#connect connect} method of the {@link | |
| 255 | + * java.net.DatagramSocket} class. That is, if a security manager has been | |
| 256 | + * installed then this method verifies that its {@link | |
| 257 | + * java.lang.SecurityManager#checkAccept checkAccept} and {@link | |
| 258 | + * java.lang.SecurityManager#checkConnect checkConnect} methods permit | |
| 259 | + * datagrams to be received from and sent to, respectively, the given | |
| 260 | + * remote address. | |
| 261 | + * | |
| 262 | + * <p> This method may be invoked at any time. It will not have any effect | |
| 263 | + * on read or write operations that are already in progress at the moment | |
| 264 | + * that it is invoked. If this channel's socket is not bound then this method | |
| 265 | + * will first cause the socket to be bound to an address that is assigned | |
| 266 | + * automatically, as if invoking the {@link #bind bind} method with a | |
| 267 | + * parameter of {@code null}. </p> | |
| 268 | + * | |
| 269 | + * @param remote | |
| 270 | + * The remote address to which this channel is to be connected | |
| 271 | + * | |
| 272 | + * @return This datagram channel | |
| 273 | + * | |
| 274 | + * @throws ClosedChannelException | |
| 275 | + * If this channel is closed | |
| 276 | + * | |
| 277 | + * @throws AsynchronousCloseException | |
| 278 | + * If another thread closes this channel | |
| 279 | + * while the connect operation is in progress | |
| 280 | + * | |
| 281 | + * @throws ClosedByInterruptException | |
| 282 | + * If another thread interrupts the current thread | |
| 283 | + * while the connect operation is in progress, thereby | |
| 284 | + * closing the channel and setting the current thread's | |
| 285 | + * interrupt status | |
| 286 | + * | |
| 287 | + * @throws SecurityException | |
| 288 | + * If a security manager has been installed | |
| 289 | + * and it does not permit access to the given remote address | |
| 290 | + * | |
| 291 | + * @throws IOException | |
| 292 | + * If some other I/O error occurs | |
| 293 | + */ | |
| 294 | + public abstract DatagramChannel connect(SocketAddress remote) | |
| 295 | + throws IOException; | |
| 296 | + | |
| 297 | + /** | |
| 298 | + * Disconnects this channel's socket. | |
| 299 | + * | |
| 300 | + * <p> The channel's socket is configured so that it can receive datagrams | |
| 301 | + * from, and sends datagrams to, any remote address so long as the security | |
| 302 | + * manager, if installed, permits it. | |
| 303 | + * | |
| 304 | + * <p> This method may be invoked at any time. It will not have any effect | |
| 305 | + * on read or write operations that are already in progress at the moment | |
| 306 | + * that it is invoked. | |
| 307 | + * | |
| 308 | + * <p> If this channel's socket is not connected, or if the channel is | |
| 309 | + * closed, then invoking this method has no effect. </p> | |
| 310 | + * | |
| 311 | + * @return This datagram channel | |
| 312 | + * | |
| 313 | + * @throws IOException | |
| 314 | + * If some other I/O error occurs | |
| 315 | + */ | |
| 316 | + public abstract DatagramChannel disconnect() throws IOException; | |
| 317 | + | |
| 318 | + /** | |
| 319 | + * Returns the remote address to which this channel's socket is connected. | |
| 320 | + * | |
| 321 | + * @return The remote address; {@code null} if the channel's socket is not | |
| 322 | + * connected | |
| 323 | + * | |
| 324 | + * @throws ClosedChannelException | |
| 325 | + * If the channel is closed | |
| 326 | + * @throws IOException | |
| 327 | + * If an I/O error occurs | |
| 328 | + * | |
| 329 | + * @since 1.7 | |
| 330 | + */ | |
| 331 | + public abstract SocketAddress getRemoteAddress() throws IOException; | |
| 332 | + | |
| 333 | + /** | |
| 334 | + * Receives a datagram via this channel. | |
| 335 | + * | |
| 336 | + * <p> If a datagram is immediately available, or if this channel is in | |
| 337 | + * blocking mode and one eventually becomes available, then the datagram is | |
| 338 | + * copied into the given byte buffer and its source address is returned. | |
| 339 | + * If this channel is in non-blocking mode and a datagram is not | |
| 340 | + * immediately available then this method immediately returns | |
| 341 | + * <tt>null</tt>. | |
| 342 | + * | |
| 343 | + * <p> The datagram is transferred into the given byte buffer starting at | |
| 344 | + * its current position, as if by a regular {@link | |
| 345 | + * ReadableByteChannel#read(java.nio.ByteBuffer) read} operation. If there | |
| 346 | + * are fewer bytes remaining in the buffer than are required to hold the | |
| 347 | + * datagram then the remainder of the datagram is silently discarded. | |
| 348 | + * | |
| 349 | + * <p> This method performs exactly the same security checks as the {@link | |
| 350 | + * java.net.DatagramSocket#receive receive} method of the {@link | |
| 351 | + * java.net.DatagramSocket} class. That is, if the socket is not connected | |
| 352 | + * to a specific remote address and a security manager has been installed | |
| 353 | + * then for each datagram received this method verifies that the source's | |
| 354 | + * address and port number are permitted by the security manager's {@link | |
| 355 | + * java.lang.SecurityManager#checkAccept checkAccept} method. The overhead | |
| 356 | + * of this security check can be avoided by first connecting the socket via | |
| 357 | + * the {@link #connect connect} method. | |
| 358 | + * | |
| 359 | + * <p> This method may be invoked at any time. If another thread has | |
| 360 | + * already initiated a read operation upon this channel, however, then an | |
| 361 | + * invocation of this method will block until the first operation is | |
| 362 | + * complete. If this channel's socket is not bound then this method will | |
| 363 | + * first cause the socket to be bound to an address that is assigned | |
| 364 | + * automatically, as if invoking the {@link #bind bind} method with a | |
| 365 | + * parameter of {@code null}. </p> | |
| 366 | + * | |
| 367 | + * @param dst | |
| 368 | + * The buffer into which the datagram is to be transferred | |
| 369 | + * | |
| 370 | + * @return The datagram's source address, | |
| 371 | + * or <tt>null</tt> if this channel is in non-blocking mode | |
| 372 | + * and no datagram was immediately available | |
| 373 | + * | |
| 374 | + * @throws ClosedChannelException | |
| 375 | + * If this channel is closed | |
| 376 | + * | |
| 377 | + * @throws AsynchronousCloseException | |
| 378 | + * If another thread closes this channel | |
| 379 | + * while the read operation is in progress | |
| 380 | + * | |
| 381 | + * @throws ClosedByInterruptException | |
| 382 | + * If another thread interrupts the current thread | |
| 383 | + * while the read operation is in progress, thereby | |
| 384 | + * closing the channel and setting the current thread's | |
| 385 | + * interrupt status | |
| 386 | + * | |
| 387 | + * @throws SecurityException | |
| 388 | + * If a security manager has been installed | |
| 389 | + * and it does not permit datagrams to be accepted | |
| 390 | + * from the datagram's sender | |
| 391 | + * | |
| 392 | + * @throws IOException | |
| 393 | + * If some other I/O error occurs | |
| 394 | + */ | |
| 395 | + public abstract SocketAddress receive(ByteBuffer dst) throws IOException; | |
| 396 | + | |
| 397 | + /** | |
| 398 | + * Sends a datagram via this channel. | |
| 399 | + * | |
| 400 | + * <p> If this channel is in non-blocking mode and there is sufficient room | |
| 401 | + * in the underlying output buffer, or if this channel is in blocking mode | |
| 402 | + * and sufficient room becomes available, then the remaining bytes in the | |
| 403 | + * given buffer are transmitted as a single datagram to the given target | |
| 404 | + * address. | |
| 405 | + * | |
| 406 | + * <p> The datagram is transferred from the byte buffer as if by a regular | |
| 407 | + * {@link WritableByteChannel#write(java.nio.ByteBuffer) write} operation. | |
| 408 | + * | |
| 409 | + * <p> This method performs exactly the same security checks as the {@link | |
| 410 | + * java.net.DatagramSocket#send send} method of the {@link | |
| 411 | + * java.net.DatagramSocket} class. That is, if the socket is not connected | |
| 412 | + * to a specific remote address and a security manager has been installed | |
| 413 | + * then for each datagram sent this method verifies that the target address | |
| 414 | + * and port number are permitted by the security manager's {@link | |
| 415 | + * java.lang.SecurityManager#checkConnect checkConnect} method. The | |
| 416 | + * overhead of this security check can be avoided by first connecting the | |
| 417 | + * socket via the {@link #connect connect} method. | |
| 418 | + * | |
| 419 | + * <p> This method may be invoked at any time. If another thread has | |
| 420 | + * already initiated a write operation upon this channel, however, then an | |
| 421 | + * invocation of this method will block until the first operation is | |
| 422 | + * complete. If this channel's socket is not bound then this method will | |
| 423 | + * first cause the socket to be bound to an address that is assigned | |
| 424 | + * automatically, as if by invoking the {@link #bind bind} method with a | |
| 425 | + * parameter of {@code null}. </p> | |
| 426 | + * | |
| 427 | + * @param src | |
| 428 | + * The buffer containing the datagram to be sent | |
| 429 | + * | |
| 430 | + * @param target | |
| 431 | + * The address to which the datagram is to be sent | |
| 432 | + * | |
| 433 | + * @return The number of bytes sent, which will be either the number | |
| 434 | + * of bytes that were remaining in the source buffer when this | |
| 435 | + * method was invoked or, if this channel is non-blocking, may be | |
| 436 | + * zero if there was insufficient room for the datagram in the | |
| 437 | + * underlying output buffer | |
| 438 | + * | |
| 439 | + * @throws ClosedChannelException | |
| 440 | + * If this channel is closed | |
| 441 | + * | |
| 442 | + * @throws AsynchronousCloseException | |
| 443 | + * If another thread closes this channel | |
| 444 | + * while the read operation is in progress | |
| 445 | + * | |
| 446 | + * @throws ClosedByInterruptException | |
| 447 | + * If another thread interrupts the current thread | |
| 448 | + * while the read operation is in progress, thereby | |
| 449 | + * closing the channel and setting the current thread's | |
| 450 | + * interrupt status | |
| 451 | + * | |
| 452 | + * @throws SecurityException | |
| 453 | + * If a security manager has been installed | |
| 454 | + * and it does not permit datagrams to be sent | |
| 455 | + * to the given address | |
| 456 | + * | |
| 457 | + * @throws IOException | |
| 458 | + * If some other I/O error occurs | |
| 459 | + */ | |
| 460 | + public abstract int send(ByteBuffer src, SocketAddress target) | |
| 461 | + throws IOException; | |
| 462 | + | |
| 463 | + | |
| 464 | + // -- ByteChannel operations -- | |
| 465 | + | |
| 466 | + /** | |
| 467 | + * Reads a datagram from this channel. | |
| 468 | + * | |
| 469 | + * <p> This method may only be invoked if this channel's socket is | |
| 470 | + * connected, and it only accepts datagrams from the socket's peer. If | |
| 471 | + * there are more bytes in the datagram than remain in the given buffer | |
| 472 | + * then the remainder of the datagram is silently discarded. Otherwise | |
| 473 | + * this method behaves exactly as specified in the {@link | |
| 474 | + * ReadableByteChannel} interface. </p> | |
| 475 | + * | |
| 476 | + * @throws NotYetConnectedException | |
| 477 | + * If this channel's socket is not connected | |
| 478 | + */ | |
| 479 | + public abstract int read(ByteBuffer dst) throws IOException; | |
| 480 | + | |
| 481 | + /** | |
| 482 | + * Reads a datagram from this channel. | |
| 483 | + * | |
| 484 | + * <p> This method may only be invoked if this channel's socket is | |
| 485 | + * connected, and it only accepts datagrams from the socket's peer. If | |
| 486 | + * there are more bytes in the datagram than remain in the given buffers | |
| 487 | + * then the remainder of the datagram is silently discarded. Otherwise | |
| 488 | + * this method behaves exactly as specified in the {@link | |
| 489 | + * ScatteringByteChannel} interface. </p> | |
| 490 | + * | |
| 491 | + * @throws NotYetConnectedException | |
| 492 | + * If this channel's socket is not connected | |
| 493 | + */ | |
| 494 | + public abstract long read(ByteBuffer[] dsts, int offset, int length) | |
| 495 | + throws IOException; | |
| 496 | + | |
| 497 | + /** | |
| 498 | + * Reads a datagram from this channel. | |
| 499 | + * | |
| 500 | + * <p> This method may only be invoked if this channel's socket is | |
| 501 | + * connected, and it only accepts datagrams from the socket's peer. If | |
| 502 | + * there are more bytes in the datagram than remain in the given buffers | |
| 503 | + * then the remainder of the datagram is silently discarded. Otherwise | |
| 504 | + * this method behaves exactly as specified in the {@link | |
| 505 | + * ScatteringByteChannel} interface. </p> | |
| 506 | + * | |
| 507 | + * @throws NotYetConnectedException | |
| 508 | + * If this channel's socket is not connected | |
| 509 | + */ | |
| 510 | + public final long read(ByteBuffer[] dsts) throws IOException { | |
| 511 | + return read(dsts, 0, dsts.length); | |
| 512 | + } | |
| 513 | + | |
| 514 | + /** | |
| 515 | + * Writes a datagram to this channel. | |
| 516 | + * | |
| 517 | + * <p> This method may only be invoked if this channel's socket is | |
| 518 | + * connected, in which case it sends datagrams directly to the socket's | |
| 519 | + * peer. Otherwise it behaves exactly as specified in the {@link | |
| 520 | + * WritableByteChannel} interface. </p> | |
| 521 | + * | |
| 522 | + * @throws NotYetConnectedException | |
| 523 | + * If this channel's socket is not connected | |
| 524 | + */ | |
| 525 | + public abstract int write(ByteBuffer src) throws IOException; | |
| 526 | + | |
| 527 | + /** | |
| 528 | + * Writes a datagram to this channel. | |
| 529 | + * | |
| 530 | + * <p> This method may only be invoked if this channel's socket is | |
| 531 | + * connected, in which case it sends datagrams directly to the socket's | |
| 532 | + * peer. Otherwise it behaves exactly as specified in the {@link | |
| 533 | + * GatheringByteChannel} interface. </p> | |
| 534 | + * | |
| 535 | + * @return The number of bytes sent, which will be either the number | |
| 536 | + * of bytes that were remaining in the source buffer when this | |
| 537 | + * method was invoked or, if this channel is non-blocking, may be | |
| 538 | + * zero if there was insufficient room for the datagram in the | |
| 539 | + * underlying output buffer | |
| 540 | + * | |
| 541 | + * @throws NotYetConnectedException | |
| 542 | + * If this channel's socket is not connected | |
| 543 | + */ | |
| 544 | + public abstract long write(ByteBuffer[] srcs, int offset, int length) | |
| 545 | + throws IOException; | |
| 546 | + | |
| 547 | + /** | |
| 548 | + * Writes a datagram to this channel. | |
| 549 | + * | |
| 550 | + * <p> This method may only be invoked if this channel's socket is | |
| 551 | + * connected, in which case it sends datagrams directly to the socket's | |
| 552 | + * peer. Otherwise it behaves exactly as specified in the {@link | |
| 553 | + * GatheringByteChannel} interface. </p> | |
| 554 | + * | |
| 555 | + * @return The number of bytes sent, which will be either the number | |
| 556 | + * of bytes that were remaining in the source buffer when this | |
| 557 | + * method was invoked or, if this channel is non-blocking, may be | |
| 558 | + * zero if there was insufficient room for the datagram in the | |
| 559 | + * underlying output buffer | |
| 560 | + * | |
| 561 | + * @throws NotYetConnectedException | |
| 562 | + * If this channel's socket is not connected | |
| 563 | + */ | |
| 564 | + public final long write(ByteBuffer[] srcs) throws IOException { | |
| 565 | + return write(srcs, 0, srcs.length); | |
| 566 | + } | |
| 567 | + | |
| 568 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,1157 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, 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.*; | |
| 29 | +import java.nio.ByteBuffer; | |
| 30 | +import java.nio.MappedByteBuffer; | |
| 31 | +import java.nio.channels.spi.AbstractInterruptibleChannel; | |
| 32 | +import java.nio.file.*; | |
| 33 | +import java.nio.file.attribute.FileAttribute; | |
| 34 | +import java.nio.file.spi.*; | |
| 35 | +import java.util.Set; | |
| 36 | +import java.util.HashSet; | |
| 37 | +import java.util.Collections; | |
| 38 | + | |
| 39 | +/** | |
| 40 | + * A channel for reading, writing, mapping, and manipulating a file. | |
| 41 | + * | |
| 42 | + * <p> A file channel is a {@link SeekableByteChannel} that is connected to | |
| 43 | + * a file. It has a current <i>position</i> within its file which can | |
| 44 | + * be both {@link #position() <i>queried</i>} and {@link #position(long) | |
| 45 | + * <i>modified</i>}. The file itself contains a variable-length sequence | |
| 46 | + * of bytes that can be read and written and whose current {@link #size | |
| 47 | + * <i>size</i>} can be queried. The size of the file increases | |
| 48 | + * when bytes are written beyond its current size; the size of the file | |
| 49 | + * decreases when it is {@link #truncate </code><i>truncated</i><code>}. The | |
| 50 | + * file may also have some associated <i>metadata</i> such as access | |
| 51 | + * permissions, content type, and last-modification time; this class does not | |
| 52 | + * define methods for metadata access. | |
| 53 | + * | |
| 54 | + * <p> In addition to the familiar read, write, and close operations of byte | |
| 55 | + * channels, this class defines the following file-specific operations: </p> | |
| 56 | + * | |
| 57 | + * <ul> | |
| 58 | + * | |
| 59 | + * <li><p> Bytes may be {@link #read(ByteBuffer, long) read} or | |
| 60 | + * {@link #write(ByteBuffer, long) <i>written</i>} at an absolute | |
| 61 | + * position in a file in a way that does not affect the channel's current | |
| 62 | + * position. </p></li> | |
| 63 | + * | |
| 64 | + * <li><p> A region of a file may be {@link #map <i>mapped</i>} | |
| 65 | + * directly into memory; for large files this is often much more efficient | |
| 66 | + * than invoking the usual <tt>read</tt> or <tt>write</tt> methods. | |
| 67 | + * </p></li> | |
| 68 | + * | |
| 69 | + * <li><p> Updates made to a file may be {@link #force <i>forced | |
| 70 | + * out</i>} to the underlying storage device, ensuring that data are not | |
| 71 | + * lost in the event of a system crash. </p></li> | |
| 72 | + * | |
| 73 | + * <li><p> Bytes can be transferred from a file {@link #transferTo <i>to | |
| 74 | + * some other channel</i>}, and {@link #transferFrom <i>vice | |
| 75 | + * versa</i>}, in a way that can be optimized by many operating systems | |
| 76 | + * into a very fast transfer directly to or from the filesystem cache. | |
| 77 | + * </p></li> | |
| 78 | + * | |
| 79 | + * <li><p> A region of a file may be {@link FileLock <i>locked</i>} | |
| 80 | + * against access by other programs. </p></li> | |
| 81 | + * | |
| 82 | + * </ul> | |
| 83 | + * | |
| 84 | + * <p> File channels are safe for use by multiple concurrent threads. The | |
| 85 | + * {@link Channel#close close} method may be invoked at any time, as specified | |
| 86 | + * by the {@link Channel} interface. Only one operation that involves the | |
| 87 | + * channel's position or can change its file's size may be in progress at any | |
| 88 | + * given time; attempts to initiate a second such operation while the first is | |
| 89 | + * still in progress will block until the first operation completes. Other | |
| 90 | + * operations, in particular those that take an explicit position, may proceed | |
| 91 | + * concurrently; whether they in fact do so is dependent upon the underlying | |
| 92 | + * implementation and is therefore unspecified. | |
| 93 | + * | |
| 94 | + * <p> The view of a file provided by an instance of this class is guaranteed | |
| 95 | + * to be consistent with other views of the same file provided by other | |
| 96 | + * instances in the same program. The view provided by an instance of this | |
| 97 | + * class may or may not, however, be consistent with the views seen by other | |
| 98 | + * concurrently-running programs due to caching performed by the underlying | |
| 99 | + * operating system and delays induced by network-filesystem protocols. This | |
| 100 | + * is true regardless of the language in which these other programs are | |
| 101 | + * written, and whether they are running on the same machine or on some other | |
| 102 | + * machine. The exact nature of any such inconsistencies are system-dependent | |
| 103 | + * and are therefore unspecified. | |
| 104 | + * | |
| 105 | + * <p> A file channel is created by invoking one of the {@link #open open} | |
| 106 | + * methods defined by this class. A file channel can also be obtained from an | |
| 107 | + * existing {@link java.io.FileInputStream#getChannel FileInputStream}, {@link | |
| 108 | + * java.io.FileOutputStream#getChannel FileOutputStream}, or {@link | |
| 109 | + * java.io.RandomAccessFile#getChannel RandomAccessFile} object by invoking | |
| 110 | + * that object's <tt>getChannel</tt> method, which returns a file channel that | |
| 111 | + * is connected to the same underlying file. Where the file channel is obtained | |
| 112 | + * from an existing stream or random access file then the state of the file | |
| 113 | + * channel is intimately connected to that of the object whose <tt>getChannel</tt> | |
| 114 | + * method returned the channel. Changing the channel's position, whether | |
| 115 | + * explicitly or by reading or writing bytes, will change the file position of | |
| 116 | + * the originating object, and vice versa. Changing the file's length via the | |
| 117 | + * file channel will change the length seen via the originating object, and vice | |
| 118 | + * versa. Changing the file's content by writing bytes will change the content | |
| 119 | + * seen by the originating object, and vice versa. | |
| 120 | + * | |
| 121 | + * <a name="open-mode"></a> <p> At various points this class specifies that an | |
| 122 | + * instance that is "open for reading," "open for writing," or "open for | |
| 123 | + * reading and writing" is required. A channel obtained via the {@link | |
| 124 | + * java.io.FileInputStream#getChannel getChannel} method of a {@link | |
| 125 | + * java.io.FileInputStream} instance will be open for reading. A channel | |
| 126 | + * obtained via the {@link java.io.FileOutputStream#getChannel getChannel} | |
| 127 | + * method of a {@link java.io.FileOutputStream} instance will be open for | |
| 128 | + * writing. Finally, a channel obtained via the {@link | |
| 129 | + * java.io.RandomAccessFile#getChannel getChannel} method of a {@link | |
| 130 | + * java.io.RandomAccessFile} instance will be open for reading if the instance | |
| 131 | + * was created with mode <tt>"r"</tt> and will be open for reading and writing | |
| 132 | + * if the instance was created with mode <tt>"rw"</tt>. | |
| 133 | + * | |
| 134 | + * <a name="append-mode"></a><p> A file channel that is open for writing may be in | |
| 135 | + * <i>append mode</i>, for example if it was obtained from a file-output stream | |
| 136 | + * that was created by invoking the {@link | |
| 137 | + * java.io.FileOutputStream#FileOutputStream(java.io.File,boolean) | |
| 138 | + * FileOutputStream(File,boolean)} constructor and passing <tt>true</tt> for | |
| 139 | + * the second parameter. In this mode each invocation of a relative write | |
| 140 | + * operation first advances the position to the end of the file and then writes | |
| 141 | + * the requested data. Whether the advancement of the position and the writing | |
| 142 | + * of the data are done in a single atomic operation is system-dependent and | |
| 143 | + * therefore unspecified. | |
| 144 | + * | |
| 145 | + * @see java.io.FileInputStream#getChannel() | |
| 146 | + * @see java.io.FileOutputStream#getChannel() | |
| 147 | + * @see java.io.RandomAccessFile#getChannel() | |
| 148 | + * | |
| 149 | + * @author Mark Reinhold | |
| 150 | + * @author Mike McCloskey | |
| 151 | + * @author JSR-51 Expert Group | |
| 152 | + * @since 1.4 | |
| 153 | + */ | |
| 154 | + | |
| 155 | +public abstract class FileChannel | |
| 156 | + extends AbstractInterruptibleChannel | |
| 157 | + implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel | |
| 158 | +{ | |
| 159 | + /** | |
| 160 | + * Initializes a new instance of this class. | |
| 161 | + */ | |
| 162 | + protected FileChannel() { } | |
| 163 | + | |
| 164 | + /** | |
| 165 | + * Opens or creates a file, returning a file channel to access the file. | |
| 166 | + * | |
| 167 | + * <p> The {@code options} parameter determines how the file is opened. | |
| 168 | + * The {@link StandardOpenOption#READ READ} and {@link StandardOpenOption#WRITE | |
| 169 | + * WRITE} options determine if the file should be opened for reading and/or | |
| 170 | + * writing. If neither option (or the {@link StandardOpenOption#APPEND APPEND} | |
| 171 | + * option) is contained in the array then the file is opened for reading. | |
| 172 | + * By default reading or writing commences at the beginning of the file. | |
| 173 | + * | |
| 174 | + * <p> In the addition to {@code READ} and {@code WRITE}, the following | |
| 175 | + * options may be present: | |
| 176 | + * | |
| 177 | + * <table border=1 cellpadding=5 summary=""> | |
| 178 | + * <tr> <th>Option</th> <th>Description</th> </tr> | |
| 179 | + * <tr> | |
| 180 | + * <td> {@link StandardOpenOption#APPEND APPEND} </td> | |
| 181 | + * <td> If this option is present then the file is opened for writing and | |
| 182 | + * each invocation of the channel's {@code write} method first advances | |
| 183 | + * the position to the end of the file and then writes the requested | |
| 184 | + * data. Whether the advancement of the position and the writing of the | |
| 185 | + * data are done in a single atomic operation is system-dependent and | |
| 186 | + * therefore unspecified. This option may not be used in conjunction | |
| 187 | + * with the {@code READ} or {@code TRUNCATE_EXISTING} options. </td> | |
| 188 | + * </tr> | |
| 189 | + * <tr> | |
| 190 | + * <td> {@link StandardOpenOption#TRUNCATE_EXISTING TRUNCATE_EXISTING} </td> | |
| 191 | + * <td> If this option is present then the existing file is truncated to | |
| 192 | + * a size of 0 bytes. This option is ignored when the file is opened only | |
| 193 | + * for reading. </td> | |
| 194 | + * </tr> | |
| 195 | + * <tr> | |
| 196 | + * <td> {@link StandardOpenOption#CREATE_NEW CREATE_NEW} </td> | |
| 197 | + * <td> If this option is present then a new file is created, failing if | |
| 198 | + * the file already exists. When creating a file the check for the | |
| 199 | + * existence of the file and the creation of the file if it does not exist | |
| 200 | + * is atomic with respect to other file system operations. This option is | |
| 201 | + * ignored when the file is opened only for reading. </td> | |
| 202 | + * </tr> | |
| 203 | + * <tr> | |
| 204 | + * <td > {@link StandardOpenOption#CREATE CREATE} </td> | |
| 205 | + * <td> If this option is present then an existing file is opened if it | |
| 206 | + * exists, otherwise a new file is created. When creating a file the check | |
| 207 | + * for the existence of the file and the creation of the file if it does | |
| 208 | + * not exist is atomic with respect to other file system operations. This | |
| 209 | + * option is ignored if the {@code CREATE_NEW} option is also present or | |
| 210 | + * the file is opened only for reading. </td> | |
| 211 | + * </tr> | |
| 212 | + * <tr> | |
| 213 | + * <td > {@link StandardOpenOption#DELETE_ON_CLOSE DELETE_ON_CLOSE} </td> | |
| 214 | + * <td> When this option is present then the implementation makes a | |
| 215 | + * <em>best effort</em> attempt to delete the file when closed by the | |
| 216 | + * the {@link #close close} method. If the {@code close} method is not | |
| 217 | + * invoked then a <em>best effort</em> attempt is made to delete the file | |
| 218 | + * when the Java virtual machine terminates. </td> | |
| 219 | + * </tr> | |
| 220 | + * <tr> | |
| 221 | + * <td>{@link StandardOpenOption#SPARSE SPARSE} </td> | |
| 222 | + * <td> When creating a new file this option is a <em>hint</em> that the | |
| 223 | + * new file will be sparse. This option is ignored when not creating | |
| 224 | + * a new file. </td> | |
| 225 | + * </tr> | |
| 226 | + * <tr> | |
| 227 | + * <td> {@link StandardOpenOption#SYNC SYNC} </td> | |
| 228 | + * <td> Requires that every update to the file's content or metadata be | |
| 229 | + * written synchronously to the underlying storage device. (see <a | |
| 230 | + * href="../file/package-summary.html#integrity"> Synchronized I/O file | |
| 231 | + * integrity</a>). </td> | |
| 232 | + * <tr> | |
| 233 | + * <tr> | |
| 234 | + * <td> {@link StandardOpenOption#DSYNC DSYNC} </td> | |
| 235 | + * <td> Requires that every update to the file's content be written | |
| 236 | + * synchronously to the underlying storage device. (see <a | |
| 237 | + * href="../file/package-summary.html#integrity"> Synchronized I/O file | |
| 238 | + * integrity</a>). </td> | |
| 239 | + * </tr> | |
| 240 | + * </table> | |
| 241 | + * | |
| 242 | + * <p> An implementation may also support additional options. | |
| 243 | + * | |
| 244 | + * <p> The {@code attrs} parameter is an optional array of file {@link | |
| 245 | + * FileAttribute file-attributes} to set atomically when creating the file. | |
| 246 | + * | |
| 247 | + * <p> The new channel is created by invoking the {@link | |
| 248 | + * FileSystemProvider#newFileChannel newFileChannel} method on the | |
| 249 | + * provider that created the {@code Path}. | |
| 250 | + * | |
| 251 | + * @param path | |
| 252 | + * The path of the file to open or create | |
| 253 | + * @param options | |
| 254 | + * Options specifying how the file is opened | |
| 255 | + * @param attrs | |
| 256 | + * An optional list of file attributes to set atomically when | |
| 257 | + * creating the file | |
| 258 | + * | |
| 259 | + * @return A new file channel | |
| 260 | + * | |
| 261 | + * @throws IllegalArgumentException | |
| 262 | + * If the set contains an invalid combination of options | |
| 263 | + * @throws UnsupportedOperationException | |
| 264 | + * If the {@code path} is associated with a provider that does not | |
| 265 | + * support creating file channels, or an unsupported open option is | |
| 266 | + * specified, or the array contains an attribute that cannot be set | |
| 267 | + * atomically when creating the file | |
| 268 | + * @throws IOException | |
| 269 | + * If an I/O error occurs | |
| 270 | + * @throws SecurityException | |
| 271 | + * If a security manager is installed and it denies an | |
| 272 | + * unspecified permission required by the implementation. | |
| 273 | + * In the case of the default provider, the {@link | |
| 274 | + * SecurityManager#checkRead(String)} method is invoked to check | |
| 275 | + * read access if the file is opened for reading. The {@link | |
| 276 | + * SecurityManager#checkWrite(String)} method is invoked to check | |
| 277 | + * write access if the file is opened for writing | |
| 278 | + * | |
| 279 | + * @since 1.7 | |
| 280 | + */ | |
| 281 | + public static FileChannel open(Path path, | |
| 282 | + Set<? extends OpenOption> options, | |
| 283 | + FileAttribute<?>... attrs) | |
| 284 | + throws IOException | |
| 285 | + { | |
| 286 | + FileSystemProvider provider = path.getFileSystem().provider(); | |
| 287 | + return provider.newFileChannel(path, options, attrs); | |
| 288 | + } | |
| 289 | + | |
| 290 | + private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0]; | |
| 291 | + | |
| 292 | + /** | |
| 293 | + * Opens or creates a file, returning a file channel to access the file. | |
| 294 | + * | |
| 295 | + * <p> An invocation of this method behaves in exactly the same way as the | |
| 296 | + * invocation | |
| 297 | + * <pre> | |
| 298 | + * fc.{@link #open(Path,Set,FileAttribute[]) open}(file, opts, new FileAttribute<?>[0]); | |
| 299 | + * </pre> | |
| 300 | + * where {@code opts} is a set of the options specified in the {@code | |
| 301 | + * options} array. | |
| 302 | + * | |
| 303 | + * @param path | |
| 304 | + * The path of the file to open or create | |
| 305 | + * @param options | |
| 306 | + * Options specifying how the file is opened | |
| 307 | + * | |
| 308 | + * @return A new file channel | |
| 309 | + * | |
| 310 | + * @throws IllegalArgumentException | |
| 311 | + * If the set contains an invalid combination of options | |
| 312 | + * @throws UnsupportedOperationException | |
| 313 | + * If the {@code path} is associated with a provider that does not | |
| 314 | + * support creating file channels, or an unsupported open option is | |
| 315 | + * specified | |
| 316 | + * @throws IOException | |
| 317 | + * If an I/O error occurs | |
| 318 | + * @throws SecurityException | |
| 319 | + * If a security manager is installed and it denies an | |
| 320 | + * unspecified permission required by the implementation. | |
| 321 | + * In the case of the default provider, the {@link | |
| 322 | + * SecurityManager#checkRead(String)} method is invoked to check | |
| 323 | + * read access if the file is opened for reading. The {@link | |
| 324 | + * SecurityManager#checkWrite(String)} method is invoked to check | |
| 325 | + * write access if the file is opened for writing | |
| 326 | + * | |
| 327 | + * @since 1.7 | |
| 328 | + */ | |
| 329 | + public static FileChannel open(Path path, OpenOption... options) | |
| 330 | + throws IOException | |
| 331 | + { | |
| 332 | + Set<OpenOption> set = new HashSet<OpenOption>(options.length); | |
| 333 | + Collections.addAll(set, options); | |
| 334 | + return open(path, set, NO_ATTRIBUTES); | |
| 335 | + } | |
| 336 | + | |
| 337 | + // -- Channel operations -- | |
| 338 | + | |
| 339 | + /** | |
| 340 | + * Reads a sequence of bytes from this channel into the given buffer. | |
| 341 | + * | |
| 342 | + * <p> Bytes are read starting at this channel's current file position, and | |
| 343 | + * then the file position is updated with the number of bytes actually | |
| 344 | + * read. Otherwise this method behaves exactly as specified in the {@link | |
| 345 | + * ReadableByteChannel} interface. </p> | |
| 346 | + */ | |
| 347 | + public abstract int read(ByteBuffer dst) throws IOException; | |
| 348 | + | |
| 349 | + /** | |
| 350 | + * Reads a sequence of bytes from this channel into a subsequence of the | |
| 351 | + * given buffers. | |
| 352 | + * | |
| 353 | + * <p> Bytes are read starting at this channel's current file position, and | |
| 354 | + * then the file position is updated with the number of bytes actually | |
| 355 | + * read. Otherwise this method behaves exactly as specified in the {@link | |
| 356 | + * ScatteringByteChannel} interface. </p> | |
| 357 | + */ | |
| 358 | + public abstract long read(ByteBuffer[] dsts, int offset, int length) | |
| 359 | + throws IOException; | |
| 360 | + | |
| 361 | + /** | |
| 362 | + * Reads a sequence of bytes from this channel into the given buffers. | |
| 363 | + * | |
| 364 | + * <p> Bytes are read starting at this channel's current file position, and | |
| 365 | + * then the file position is updated with the number of bytes actually | |
| 366 | + * read. Otherwise this method behaves exactly as specified in the {@link | |
| 367 | + * ScatteringByteChannel} interface. </p> | |
| 368 | + */ | |
| 369 | + public final long read(ByteBuffer[] dsts) throws IOException { | |
| 370 | + return read(dsts, 0, dsts.length); | |
| 371 | + } | |
| 372 | + | |
| 373 | + /** | |
| 374 | + * Writes a sequence of bytes to this channel from the given buffer. | |
| 375 | + * | |
| 376 | + * <p> Bytes are written starting at this channel's current file position | |
| 377 | + * unless the channel is in append mode, in which case the position is | |
| 378 | + * first advanced to the end of the file. The file is grown, if necessary, | |
| 379 | + * to accommodate the written bytes, and then the file position is updated | |
| 380 | + * with the number of bytes actually written. Otherwise this method | |
| 381 | + * behaves exactly as specified by the {@link WritableByteChannel} | |
| 382 | + * interface. </p> | |
| 383 | + */ | |
| 384 | + public abstract int write(ByteBuffer src) throws IOException; | |
| 385 | + | |
| 386 | + /** | |
| 387 | + * Writes a sequence of bytes to this channel from a subsequence of the | |
| 388 | + * given buffers. | |
| 389 | + * | |
| 390 | + * <p> Bytes are written starting at this channel's current file position | |
| 391 | + * unless the channel is in append mode, in which case the position is | |
| 392 | + * first advanced to the end of the file. The file is grown, if necessary, | |
| 393 | + * to accommodate the written bytes, and then the file position is updated | |
| 394 | + * with the number of bytes actually written. Otherwise this method | |
| 395 | + * behaves exactly as specified in the {@link GatheringByteChannel} | |
| 396 | + * interface. </p> | |
| 397 | + */ | |
| 398 | + public abstract long write(ByteBuffer[] srcs, int offset, int length) | |
| 399 | + throws IOException; | |
| 400 | + | |
| 401 | + /** | |
| 402 | + * Writes a sequence of bytes to this channel from the given buffers. | |
| 403 | + * | |
| 404 | + * <p> Bytes are written starting at this channel's current file position | |
| 405 | + * unless the channel is in append mode, in which case the position is | |
| 406 | + * first advanced to the end of the file. The file is grown, if necessary, | |
| 407 | + * to accommodate the written bytes, and then the file position is updated | |
| 408 | + * with the number of bytes actually written. Otherwise this method | |
| 409 | + * behaves exactly as specified in the {@link GatheringByteChannel} | |
| 410 | + * interface. </p> | |
| 411 | + */ | |
| 412 | + public final long write(ByteBuffer[] srcs) throws IOException { | |
| 413 | + return write(srcs, 0, srcs.length); | |
| 414 | + } | |
| 415 | + | |
| 416 | + | |
| 417 | + // -- Other operations -- | |
| 418 | + | |
| 419 | + /** | |
| 420 | + * Returns this channel's file position. </p> | |
| 421 | + * | |
| 422 | + * @return This channel's file position, | |
| 423 | + * a non-negative integer counting the number of bytes | |
| 424 | + * from the beginning of the file to the current position | |
| 425 | + * | |
| 426 | + * @throws ClosedChannelException | |
| 427 | + * If this channel is closed | |
| 428 | + * | |
| 429 | + * @throws IOException | |
| 430 | + * If some other I/O error occurs | |
| 431 | + */ | |
| 432 | + public abstract long position() throws IOException; | |
| 433 | + | |
| 434 | + /** | |
| 435 | + * Sets this channel's file position. | |
| 436 | + * | |
| 437 | + * <p> Setting the position to a value that is greater than the file's | |
| 438 | + * current size is legal but does not change the size of the file. A later | |
| 439 | + * attempt to read bytes at such a position will immediately return an | |
| 440 | + * end-of-file indication. A later attempt to write bytes at such a | |
| 441 | + * position will cause the file to be grown to accommodate the new bytes; | |
| 442 | + * the values of any bytes between the previous end-of-file and the | |
| 443 | + * newly-written bytes are unspecified. </p> | |
| 444 | + * | |
| 445 | + * @param newPosition | |
| 446 | + * The new position, a non-negative integer counting | |
| 447 | + * the number of bytes from the beginning of the file | |
| 448 | + * | |
| 449 | + * @return This file channel | |
| 450 | + * | |
| 451 | + * @throws ClosedChannelException | |
| 452 | + * If this channel is closed | |
| 453 | + * | |
| 454 | + * @throws IllegalArgumentException | |
| 455 | + * If the new position is negative | |
| 456 | + * | |
| 457 | + * @throws IOException | |
| 458 | + * If some other I/O error occurs | |
| 459 | + */ | |
| 460 | + public abstract FileChannel position(long newPosition) throws IOException; | |
| 461 | + | |
| 462 | + /** | |
| 463 | + * Returns the current size of this channel's file. </p> | |
| 464 | + * | |
| 465 | + * @return The current size of this channel's file, | |
| 466 | + * measured in bytes | |
| 467 | + * | |
| 468 | + * @throws ClosedChannelException | |
| 469 | + * If this channel is closed | |
| 470 | + * | |
| 471 | + * @throws IOException | |
| 472 | + * If some other I/O error occurs | |
| 473 | + */ | |
| 474 | + public abstract long size() throws IOException; | |
| 475 | + | |
| 476 | + /** | |
| 477 | + * Truncates this channel's file to the given size. | |
| 478 | + * | |
| 479 | + * <p> If the given size is less than the file's current size then the file | |
| 480 | + * is truncated, discarding any bytes beyond the new end of the file. If | |
| 481 | + * the given size is greater than or equal to the file's current size then | |
| 482 | + * the file is not modified. In either case, if this channel's file | |
| 483 | + * position is greater than the given size then it is set to that size. | |
| 484 | + * </p> | |
| 485 | + * | |
| 486 | + * @param size | |
| 487 | + * The new size, a non-negative byte count | |
| 488 | + * | |
| 489 | + * @return This file channel | |
| 490 | + * | |
| 491 | + * @throws NonWritableChannelException | |
| 492 | + * If this channel was not opened for writing | |
| 493 | + * | |
| 494 | + * @throws ClosedChannelException | |
| 495 | + * If this channel is closed | |
| 496 | + * | |
| 497 | + * @throws IllegalArgumentException | |
| 498 | + * If the new size is negative | |
| 499 | + * | |
| 500 | + * @throws IOException | |
| 501 | + * If some other I/O error occurs | |
| 502 | + */ | |
| 503 | + public abstract FileChannel truncate(long size) throws IOException; | |
| 504 | + | |
| 505 | + /** | |
| 506 | + * Forces any updates to this channel's file to be written to the storage | |
| 507 | + * device that contains it. | |
| 508 | + * | |
| 509 | + * <p> If this channel's file resides on a local storage device then when | |
| 510 | + * this method returns it is guaranteed that all changes made to the file | |
| 511 | + * since this channel was created, or since this method was last invoked, | |
| 512 | + * will have been written to that device. This is useful for ensuring that | |
| 513 | + * critical information is not lost in the event of a system crash. | |
| 514 | + * | |
| 515 | + * <p> If the file does not reside on a local device then no such guarantee | |
| 516 | + * is made. | |
| 517 | + * | |
| 518 | + * <p> The <tt>metaData</tt> parameter can be used to limit the number of | |
| 519 | + * I/O operations that this method is required to perform. Passing | |
| 520 | + * <tt>false</tt> for this parameter indicates that only updates to the | |
| 521 | + * file's content need be written to storage; passing <tt>true</tt> | |
| 522 | + * indicates that updates to both the file's content and metadata must be | |
| 523 | + * written, which generally requires at least one more I/O operation. | |
| 524 | + * Whether this parameter actually has any effect is dependent upon the | |
| 525 | + * underlying operating system and is therefore unspecified. | |
| 526 | + * | |
| 527 | + * <p> Invoking this method may cause an I/O operation to occur even if the | |
| 528 | + * channel was only opened for reading. Some operating systems, for | |
| 529 | + * example, maintain a last-access time as part of a file's metadata, and | |
| 530 | + * this time is updated whenever the file is read. Whether or not this is | |
| 531 | + * actually done is system-dependent and is therefore unspecified. | |
| 532 | + * | |
| 533 | + * <p> This method is only guaranteed to force changes that were made to | |
| 534 | + * this channel's file via the methods defined in this class. It may or | |
| 535 | + * may not force changes that were made by modifying the content of a | |
| 536 | + * {@link MappedByteBuffer <i>mapped byte buffer</i>} obtained by | |
| 537 | + * invoking the {@link #map map} method. Invoking the {@link | |
| 538 | + * MappedByteBuffer#force force} method of the mapped byte buffer will | |
| 539 | + * force changes made to the buffer's content to be written. </p> | |
| 540 | + * | |
| 541 | + * @param metaData | |
| 542 | + * If <tt>true</tt> then this method is required to force changes | |
| 543 | + * to both the file's content and metadata to be written to | |
| 544 | + * storage; otherwise, it need only force content changes to be | |
| 545 | + * written | |
| 546 | + * | |
| 547 | + * @throws ClosedChannelException | |
| 548 | + * If this channel is closed | |
| 549 | + * | |
| 550 | + * @throws IOException | |
| 551 | + * If some other I/O error occurs | |
| 552 | + */ | |
| 553 | + public abstract void force(boolean metaData) throws IOException; | |
| 554 | + | |
| 555 | + /** | |
| 556 | + * Transfers bytes from this channel's file to the given writable byte | |
| 557 | + * channel. | |
| 558 | + * | |
| 559 | + * <p> An attempt is made to read up to <tt>count</tt> bytes starting at | |
| 560 | + * the given <tt>position</tt> in this channel's file and write them to the | |
| 561 | + * target channel. An invocation of this method may or may not transfer | |
| 562 | + * all of the requested bytes; whether or not it does so depends upon the | |
| 563 | + * natures and states of the channels. Fewer than the requested number of | |
| 564 | + * bytes are transferred if this channel's file contains fewer than | |
| 565 | + * <tt>count</tt> bytes starting at the given <tt>position</tt>, or if the | |
| 566 | + * target channel is non-blocking and it has fewer than <tt>count</tt> | |
| 567 | + * bytes free in its output buffer. | |
| 568 | + * | |
| 569 | + * <p> This method does not modify this channel's position. If the given | |
| 570 | + * position is greater than the file's current size then no bytes are | |
| 571 | + * transferred. If the target channel has a position then bytes are | |
| 572 | + * written starting at that position and then the position is incremented | |
| 573 | + * by the number of bytes written. | |
| 574 | + * | |
| 575 | + * <p> This method is potentially much more efficient than a simple loop | |
| 576 | + * that reads from this channel and writes to the target channel. Many | |
| 577 | + * operating systems can transfer bytes directly from the filesystem cache | |
| 578 | + * to the target channel without actually copying them. </p> | |
| 579 | + * | |
| 580 | + * @param position | |
| 581 | + * The position within the file at which the transfer is to begin; | |
| 582 | + * must be non-negative | |
| 583 | + * | |
| 584 | + * @param count | |
| 585 | + * The maximum number of bytes to be transferred; must be | |
| 586 | + * non-negative | |
| 587 | + * | |
| 588 | + * @param target | |
| 589 | + * The target channel | |
| 590 | + * | |
| 591 | + * @return The number of bytes, possibly zero, | |
| 592 | + * that were actually transferred | |
| 593 | + * | |
| 594 | + * @throws IllegalArgumentException | |
| 595 | + * If the preconditions on the parameters do not hold | |
| 596 | + * | |
| 597 | + * @throws NonReadableChannelException | |
| 598 | + * If this channel was not opened for reading | |
| 599 | + * | |
| 600 | + * @throws NonWritableChannelException | |
| 601 | + * If the target channel was not opened for writing | |
| 602 | + * | |
| 603 | + * @throws ClosedChannelException | |
| 604 | + * If either this channel or the target channel is closed | |
| 605 | + * | |
| 606 | + * @throws AsynchronousCloseException | |
| 607 | + * If another thread closes either channel | |
| 608 | + * while the transfer is in progress | |
| 609 | + * | |
| 610 | + * @throws ClosedByInterruptException | |
| 611 | + * If another thread interrupts the current thread while the | |
| 612 | + * transfer is in progress, thereby closing both channels and | |
| 613 | + * setting the current thread's interrupt status | |
| 614 | + * | |
| 615 | + * @throws IOException | |
| 616 | + * If some other I/O error occurs | |
| 617 | + */ | |
| 618 | + public abstract long transferTo(long position, long count, | |
| 619 | + WritableByteChannel target) | |
| 620 | + throws IOException; | |
| 621 | + | |
| 622 | + /** | |
| 623 | + * Transfers bytes into this channel's file from the given readable byte | |
| 624 | + * channel. | |
| 625 | + * | |
| 626 | + * <p> An attempt is made to read up to <tt>count</tt> bytes from the | |
| 627 | + * source channel and write them to this channel's file starting at the | |
| 628 | + * given <tt>position</tt>. An invocation of this method may or may not | |
| 629 | + * transfer all of the requested bytes; whether or not it does so depends | |
| 630 | + * upon the natures and states of the channels. Fewer than the requested | |
| 631 | + * number of bytes will be transferred if the source channel has fewer than | |
| 632 | + * <tt>count</tt> bytes remaining, or if the source channel is non-blocking | |
| 633 | + * and has fewer than <tt>count</tt> bytes immediately available in its | |
| 634 | + * input buffer. | |
| 635 | + * | |
| 636 | + * <p> This method does not modify this channel's position. If the given | |
| 637 | + * position is greater than the file's current size then no bytes are | |
| 638 | + * transferred. If the source channel has a position then bytes are read | |
| 639 | + * starting at that position and then the position is incremented by the | |
| 640 | + * number of bytes read. | |
| 641 | + * | |
| 642 | + * <p> This method is potentially much more efficient than a simple loop | |
| 643 | + * that reads from the source channel and writes to this channel. Many | |
| 644 | + * operating systems can transfer bytes directly from the source channel | |
| 645 | + * into the filesystem cache without actually copying them. </p> | |
| 646 | + * | |
| 647 | + * @param src | |
| 648 | + * The source channel | |
| 649 | + * | |
| 650 | + * @param position | |
| 651 | + * The position within the file at which the transfer is to begin; | |
| 652 | + * must be non-negative | |
| 653 | + * | |
| 654 | + * @param count | |
| 655 | + * The maximum number of bytes to be transferred; must be | |
| 656 | + * non-negative | |
| 657 | + * | |
| 658 | + * @return The number of bytes, possibly zero, | |
| 659 | + * that were actually transferred | |
| 660 | + * | |
| 661 | + * @throws IllegalArgumentException | |
| 662 | + * If the preconditions on the parameters do not hold | |
| 663 | + * | |
| 664 | + * @throws NonReadableChannelException | |
| 665 | + * If the source channel was not opened for reading | |
| 666 | + * | |
| 667 | + * @throws NonWritableChannelException | |
| 668 | + * If this channel was not opened for writing | |
| 669 | + * | |
| 670 | + * @throws ClosedChannelException | |
| 671 | + * If either this channel or the source channel is closed | |
| 672 | + * | |
| 673 | + * @throws AsynchronousCloseException | |
| 674 | + * If another thread closes either channel | |
| 675 | + * while the transfer is in progress | |
| 676 | + * | |
| 677 | + * @throws ClosedByInterruptException | |
| 678 | + * If another thread interrupts the current thread while the | |
| 679 | + * transfer is in progress, thereby closing both channels and | |
| 680 | + * setting the current thread's interrupt status | |
| 681 | + * | |
| 682 | + * @throws IOException | |
| 683 | + * If some other I/O error occurs | |
| 684 | + */ | |
| 685 | + public abstract long transferFrom(ReadableByteChannel src, | |
| 686 | + long position, long count) | |
| 687 | + throws IOException; | |
| 688 | + | |
| 689 | + /** | |
| 690 | + * Reads a sequence of bytes from this channel into the given buffer, | |
| 691 | + * starting at the given file position. | |
| 692 | + * | |
| 693 | + * <p> This method works in the same manner as the {@link | |
| 694 | + * #read(ByteBuffer)} method, except that bytes are read starting at the | |
| 695 | + * given file position rather than at the channel's current position. This | |
| 696 | + * method does not modify this channel's position. If the given position | |
| 697 | + * is greater than the file's current size then no bytes are read. </p> | |
| 698 | + * | |
| 699 | + * @param dst | |
| 700 | + * The buffer into which bytes are to be transferred | |
| 701 | + * | |
| 702 | + * @param position | |
| 703 | + * The file position at which the transfer is to begin; | |
| 704 | + * must be non-negative | |
| 705 | + * | |
| 706 | + * @return The number of bytes read, possibly zero, or <tt>-1</tt> if the | |
| 707 | + * given position is greater than or equal to the file's current | |
| 708 | + * size | |
| 709 | + * | |
| 710 | + * @throws IllegalArgumentException | |
| 711 | + * If the position is negative | |
| 712 | + * | |
| 713 | + * @throws NonReadableChannelException | |
| 714 | + * If this channel was not opened for reading | |
| 715 | + * | |
| 716 | + * @throws ClosedChannelException | |
| 717 | + * If this channel is closed | |
| 718 | + * | |
| 719 | + * @throws AsynchronousCloseException | |
| 720 | + * If another thread closes this channel | |
| 721 | + * while the read operation is in progress | |
| 722 | + * | |
| 723 | + * @throws ClosedByInterruptException | |
| 724 | + * If another thread interrupts the current thread | |
| 725 | + * while the read operation is in progress, thereby | |
| 726 | + * closing the channel and setting the current thread's | |
| 727 | + * interrupt status | |
| 728 | + * | |
| 729 | + * @throws IOException | |
| 730 | + * If some other I/O error occurs | |
| 731 | + */ | |
| 732 | + public abstract int read(ByteBuffer dst, long position) throws IOException; | |
| 733 | + | |
| 734 | + /** | |
| 735 | + * Writes a sequence of bytes to this channel from the given buffer, | |
| 736 | + * starting at the given file position. | |
| 737 | + * | |
| 738 | + * <p> This method works in the same manner as the {@link | |
| 739 | + * #write(ByteBuffer)} method, except that bytes are written starting at | |
| 740 | + * the given file position rather than at the channel's current position. | |
| 741 | + * This method does not modify this channel's position. If the given | |
| 742 | + * position is greater than the file's current size then the file will be | |
| 743 | + * grown to accommodate the new bytes; the values of any bytes between the | |
| 744 | + * previous end-of-file and the newly-written bytes are unspecified. </p> | |
| 745 | + * | |
| 746 | + * @param src | |
| 747 | + * The buffer from which bytes are to be transferred | |
| 748 | + * | |
| 749 | + * @param position | |
| 750 | + * The file position at which the transfer is to begin; | |
| 751 | + * must be non-negative | |
| 752 | + * | |
| 753 | + * @return The number of bytes written, possibly zero | |
| 754 | + * | |
| 755 | + * @throws IllegalArgumentException | |
| 756 | + * If the position is negative | |
| 757 | + * | |
| 758 | + * @throws NonWritableChannelException | |
| 759 | + * If this channel was not opened for writing | |
| 760 | + * | |
| 761 | + * @throws ClosedChannelException | |
| 762 | + * If this channel is closed | |
| 763 | + * | |
| 764 | + * @throws AsynchronousCloseException | |
| 765 | + * If another thread closes this channel | |
| 766 | + * while the write operation is in progress | |
| 767 | + * | |
| 768 | + * @throws ClosedByInterruptException | |
| 769 | + * If another thread interrupts the current thread | |
| 770 | + * while the write operation is in progress, thereby | |
| 771 | + * closing the channel and setting the current thread's | |
| 772 | + * interrupt status | |
| 773 | + * | |
| 774 | + * @throws IOException | |
| 775 | + * If some other I/O error occurs | |
| 776 | + */ | |
| 777 | + public abstract int write(ByteBuffer src, long position) throws IOException; | |
| 778 | + | |
| 779 | + | |
| 780 | + // -- Memory-mapped buffers -- | |
| 781 | + | |
| 782 | + /** | |
| 783 | + * A typesafe enumeration for file-mapping modes. | |
| 784 | + * | |
| 785 | + * @since 1.4 | |
| 786 | + * | |
| 787 | + * @see java.nio.channels.FileChannel#map | |
| 788 | + */ | |
| 789 | + public static class MapMode { | |
| 790 | + | |
| 791 | + /** | |
| 792 | + * Mode for a read-only mapping. | |
| 793 | + */ | |
| 794 | + public static final MapMode READ_ONLY | |
| 795 | + = new MapMode("READ_ONLY"); | |
| 796 | + | |
| 797 | + /** | |
| 798 | + * Mode for a read/write mapping. | |
| 799 | + */ | |
| 800 | + public static final MapMode READ_WRITE | |
| 801 | + = new MapMode("READ_WRITE"); | |
| 802 | + | |
| 803 | + /** | |
| 804 | + * Mode for a private (copy-on-write) mapping. | |
| 805 | + */ | |
| 806 | + public static final MapMode PRIVATE | |
| 807 | + = new MapMode("PRIVATE"); | |
| 808 | + | |
| 809 | + private final String name; | |
| 810 | + | |
| 811 | + private MapMode(String name) { | |
| 812 | + this.name = name; | |
| 813 | + } | |
| 814 | + | |
| 815 | + /** | |
| 816 | + * Returns a string describing this file-mapping mode. | |
| 817 | + * | |
| 818 | + * @return A descriptive string | |
| 819 | + */ | |
| 820 | + public String toString() { | |
| 821 | + return name; | |
| 822 | + } | |
| 823 | + | |
| 824 | + } | |
| 825 | + | |
| 826 | + /** | |
| 827 | + * Maps a region of this channel's file directly into memory. | |
| 828 | + * | |
| 829 | + * <p> A region of a file may be mapped into memory in one of three modes: | |
| 830 | + * </p> | |
| 831 | + * | |
| 832 | + * <ul type=disc> | |
| 833 | + * | |
| 834 | + * <li><p> <i>Read-only:</i> Any attempt to modify the resulting buffer | |
| 835 | + * will cause a {@link java.nio.ReadOnlyBufferException} to be thrown. | |
| 836 | + * ({@link MapMode#READ_ONLY MapMode.READ_ONLY}) </p></li> | |
| 837 | + * | |
| 838 | + * <li><p> <i>Read/write:</i> Changes made to the resulting buffer will | |
| 839 | + * eventually be propagated to the file; they may or may not be made | |
| 840 | + * visible to other programs that have mapped the same file. ({@link | |
| 841 | + * MapMode#READ_WRITE MapMode.READ_WRITE}) </p></li> | |
| 842 | + * | |
| 843 | + * <li><p> <i>Private:</i> Changes made to the resulting buffer will not | |
| 844 | + * be propagated to the file and will not be visible to other programs | |
| 845 | + * that have mapped the same file; instead, they will cause private | |
| 846 | + * copies of the modified portions of the buffer to be created. ({@link | |
| 847 | + * MapMode#PRIVATE MapMode.PRIVATE}) </p></li> | |
| 848 | + * | |
| 849 | + * </ul> | |
| 850 | + * | |
| 851 | + * <p> For a read-only mapping, this channel must have been opened for | |
| 852 | + * reading; for a read/write or private mapping, this channel must have | |
| 853 | + * been opened for both reading and writing. | |
| 854 | + * | |
| 855 | + * <p> The {@link MappedByteBuffer <i>mapped byte buffer</i>} | |
| 856 | + * returned by this method will have a position of zero and a limit and | |
| 857 | + * capacity of <tt>size</tt>; its mark will be undefined. The buffer and | |
| 858 | + * the mapping that it represents will remain valid until the buffer itself | |
| 859 | + * is garbage-collected. | |
| 860 | + * | |
| 861 | + * <p> A mapping, once established, is not dependent upon the file channel | |
| 862 | + * that was used to create it. Closing the channel, in particular, has no | |
| 863 | + * effect upon the validity of the mapping. | |
| 864 | + * | |
| 865 | + * <p> Many of the details of memory-mapped files are inherently dependent | |
| 866 | + * upon the underlying operating system and are therefore unspecified. The | |
| 867 | + * behavior of this method when the requested region is not completely | |
| 868 | + * contained within this channel's file is unspecified. Whether changes | |
| 869 | + * made to the content or size of the underlying file, by this program or | |
| 870 | + * another, are propagated to the buffer is unspecified. The rate at which | |
| 871 | + * changes to the buffer are propagated to the file is unspecified. | |
| 872 | + * | |
| 873 | + * <p> For most operating systems, mapping a file into memory is more | |
| 874 | + * expensive than reading or writing a few tens of kilobytes of data via | |
| 875 | + * the usual {@link #read read} and {@link #write write} methods. From the | |
| 876 | + * standpoint of performance it is generally only worth mapping relatively | |
| 877 | + * large files into memory. </p> | |
| 878 | + * | |
| 879 | + * @param mode | |
| 880 | + * One of the constants {@link MapMode#READ_ONLY READ_ONLY}, {@link | |
| 881 | + * MapMode#READ_WRITE READ_WRITE}, or {@link MapMode#PRIVATE | |
| 882 | + * PRIVATE} defined in the {@link MapMode} class, according to | |
| 883 | + * whether the file is to be mapped read-only, read/write, or | |
| 884 | + * privately (copy-on-write), respectively | |
| 885 | + * | |
| 886 | + * @param position | |
| 887 | + * The position within the file at which the mapped region | |
| 888 | + * is to start; must be non-negative | |
| 889 | + * | |
| 890 | + * @param size | |
| 891 | + * The size of the region to be mapped; must be non-negative and | |
| 892 | + * no greater than {@link java.lang.Integer#MAX_VALUE} | |
| 893 | + * | |
| 894 | + * @return The mapped byte buffer | |
| 895 | + * | |
| 896 | + * @throws NonReadableChannelException | |
| 897 | + * If the <tt>mode</tt> is {@link MapMode#READ_ONLY READ_ONLY} but | |
| 898 | + * this channel was not opened for reading | |
| 899 | + * | |
| 900 | + * @throws NonWritableChannelException | |
| 901 | + * If the <tt>mode</tt> is {@link MapMode#READ_WRITE READ_WRITE} or | |
| 902 | + * {@link MapMode#PRIVATE PRIVATE} but this channel was not opened | |
| 903 | + * for both reading and writing | |
| 904 | + * | |
| 905 | + * @throws IllegalArgumentException | |
| 906 | + * If the preconditions on the parameters do not hold | |
| 907 | + * | |
| 908 | + * @throws IOException | |
| 909 | + * If some other I/O error occurs | |
| 910 | + * | |
| 911 | + * @see java.nio.channels.FileChannel.MapMode | |
| 912 | + * @see java.nio.MappedByteBuffer | |
| 913 | + */ | |
| 914 | + public abstract MappedByteBuffer map(MapMode mode, | |
| 915 | + long position, long size) | |
| 916 | + throws IOException; | |
| 917 | + | |
| 918 | + | |
| 919 | + // -- Locks -- | |
| 920 | + | |
| 921 | + /** | |
| 922 | + * Acquires a lock on the given region of this channel's file. | |
| 923 | + * | |
| 924 | + * <p> An invocation of this method will block until the region can be | |
| 925 | + * locked, this channel is closed, or the invoking thread is interrupted, | |
| 926 | + * whichever comes first. | |
| 927 | + * | |
| 928 | + * <p> If this channel is closed by another thread during an invocation of | |
| 929 | + * this method then an {@link AsynchronousCloseException} will be thrown. | |
| 930 | + * | |
| 931 | + * <p> If the invoking thread is interrupted while waiting to acquire the | |
| 932 | + * lock then its interrupt status will be set and a {@link | |
| 933 | + * FileLockInterruptionException} will be thrown. If the invoker's | |
| 934 | + * interrupt status is set when this method is invoked then that exception | |
| 935 | + * will be thrown immediately; the thread's interrupt status will not be | |
| 936 | + * changed. | |
| 937 | + * | |
| 938 | + * <p> The region specified by the <tt>position</tt> and <tt>size</tt> | |
| 939 | + * parameters need not be contained within, or even overlap, the actual | |
| 940 | + * underlying file. Lock regions are fixed in size; if a locked region | |
| 941 | + * initially contains the end of the file and the file grows beyond the | |
| 942 | + * region then the new portion of the file will not be covered by the lock. | |
| 943 | + * If a file is expected to grow in size and a lock on the entire file is | |
| 944 | + * required then a region starting at zero, and no smaller than the | |
| 945 | + * expected maximum size of the file, should be locked. The zero-argument | |
| 946 | + * {@link #lock()} method simply locks a region of size {@link | |
| 947 | + * Long#MAX_VALUE}. | |
| 948 | + * | |
| 949 | + * <p> Some operating systems do not support shared locks, in which case a | |
| 950 | + * request for a shared lock is automatically converted into a request for | |
| 951 | + * an exclusive lock. Whether the newly-acquired lock is shared or | |
| 952 | + * exclusive may be tested by invoking the resulting lock object's {@link | |
| 953 | + * FileLock#isShared() isShared} method. | |
| 954 | + * | |
| 955 | + * <p> File locks are held on behalf of the entire Java virtual machine. | |
| 956 | + * They are not suitable for controlling access to a file by multiple | |
| 957 | + * threads within the same virtual machine. </p> | |
| 958 | + * | |
| 959 | + * @param position | |
| 960 | + * The position at which the locked region is to start; must be | |
| 961 | + * non-negative | |
| 962 | + * | |
| 963 | + * @param size | |
| 964 | + * The size of the locked region; must be non-negative, and the sum | |
| 965 | + * <tt>position</tt> + <tt>size</tt> must be non-negative | |
| 966 | + * | |
| 967 | + * @param shared | |
| 968 | + * <tt>true</tt> to request a shared lock, in which case this | |
| 969 | + * channel must be open for reading (and possibly writing); | |
| 970 | + * <tt>false</tt> to request an exclusive lock, in which case this | |
| 971 | + * channel must be open for writing (and possibly reading) | |
| 972 | + * | |
| 973 | + * @return A lock object representing the newly-acquired lock | |
| 974 | + * | |
| 975 | + * @throws IllegalArgumentException | |
| 976 | + * If the preconditions on the parameters do not hold | |
| 977 | + * | |
| 978 | + * @throws ClosedChannelException | |
| 979 | + * If this channel is closed | |
| 980 | + * | |
| 981 | + * @throws AsynchronousCloseException | |
| 982 | + * If another thread closes this channel while the invoking | |
| 983 | + * thread is blocked in this method | |
| 984 | + * | |
| 985 | + * @throws FileLockInterruptionException | |
| 986 | + * If the invoking thread is interrupted while blocked in this | |
| 987 | + * method | |
| 988 | + * | |
| 989 | + * @throws OverlappingFileLockException | |
| 990 | + * If a lock that overlaps the requested region is already held by | |
| 991 | + * this Java virtual machine, or if another thread is already | |
| 992 | + * blocked in this method and is attempting to lock an overlapping | |
| 993 | + * region | |
| 994 | + * | |
| 995 | + * @throws NonReadableChannelException | |
| 996 | + * If <tt>shared</tt> is <tt>true</tt> this channel was not | |
| 997 | + * opened for reading | |
| 998 | + * | |
| 999 | + * @throws NonWritableChannelException | |
| 1000 | + * If <tt>shared</tt> is <tt>false</tt> but this channel was not | |
| 1001 | + * opened for writing | |
| 1002 | + * | |
| 1003 | + * @throws IOException | |
| 1004 | + * If some other I/O error occurs | |
| 1005 | + * | |
| 1006 | + * @see #lock() | |
| 1007 | + * @see #tryLock() | |
| 1008 | + * @see #tryLock(long,long,boolean) | |
| 1009 | + */ | |
| 1010 | + public abstract FileLock lock(long position, long size, boolean shared) | |
| 1011 | + throws IOException; | |
| 1012 | + | |
| 1013 | + /** | |
| 1014 | + * Acquires an exclusive lock on this channel's file. | |
| 1015 | + * | |
| 1016 | + * <p> An invocation of this method of the form <tt>fc.lock()</tt> behaves | |
| 1017 | + * in exactly the same way as the invocation | |
| 1018 | + * | |
| 1019 | + * <pre> | |
| 1020 | + * fc.{@link #lock(long,long,boolean) lock}(0L, Long.MAX_VALUE, false) </pre> | |
| 1021 | + * | |
| 1022 | + * @return A lock object representing the newly-acquired lock | |
| 1023 | + * | |
| 1024 | + * @throws ClosedChannelException | |
| 1025 | + * If this channel is closed | |
| 1026 | + * | |
| 1027 | + * @throws AsynchronousCloseException | |
| 1028 | + * If another thread closes this channel while the invoking | |
| 1029 | + * thread is blocked in this method | |
| 1030 | + * | |
| 1031 | + * @throws FileLockInterruptionException | |
| 1032 | + * If the invoking thread is interrupted while blocked in this | |
| 1033 | + * method | |
| 1034 | + * | |
| 1035 | + * @throws OverlappingFileLockException | |
| 1036 | + * If a lock that overlaps the requested region is already held by | |
| 1037 | + * this Java virtual machine, or if another thread is already | |
| 1038 | + * blocked in this method and is attempting to lock an overlapping | |
| 1039 | + * region of the same file | |
| 1040 | + * | |
| 1041 | + * @throws NonWritableChannelException | |
| 1042 | + * If this channel was not opened for writing | |
| 1043 | + * | |
| 1044 | + * @throws IOException | |
| 1045 | + * If some other I/O error occurs | |
| 1046 | + * | |
| 1047 | + * @see #lock(long,long,boolean) | |
| 1048 | + * @see #tryLock() | |
| 1049 | + * @see #tryLock(long,long,boolean) | |
| 1050 | + */ | |
| 1051 | + public final FileLock lock() throws IOException { | |
| 1052 | + return lock(0L, Long.MAX_VALUE, false); | |
| 1053 | + } | |
| 1054 | + | |
| 1055 | + /** | |
| 1056 | + * Attempts to acquire a lock on the given region of this channel's file. | |
| 1057 | + * | |
| 1058 | + * <p> This method does not block. An invocation always returns | |
| 1059 | + * immediately, either having acquired a lock on the requested region or | |
| 1060 | + * having failed to do so. If it fails to acquire a lock because an | |
| 1061 | + * overlapping lock is held by another program then it returns | |
| 1062 | + * <tt>null</tt>. If it fails to acquire a lock for any other reason then | |
| 1063 | + * an appropriate exception is thrown. | |
| 1064 | + * | |
| 1065 | + * <p> The region specified by the <tt>position</tt> and <tt>size</tt> | |
| 1066 | + * parameters need not be contained within, or even overlap, the actual | |
| 1067 | + * underlying file. Lock regions are fixed in size; if a locked region | |
| 1068 | + * initially contains the end of the file and the file grows beyond the | |
| 1069 | + * region then the new portion of the file will not be covered by the lock. | |
| 1070 | + * If a file is expected to grow in size and a lock on the entire file is | |
| 1071 | + * required then a region starting at zero, and no smaller than the | |
| 1072 | + * expected maximum size of the file, should be locked. The zero-argument | |
| 1073 | + * {@link #tryLock()} method simply locks a region of size {@link | |
| 1074 | + * Long#MAX_VALUE}. | |
| 1075 | + * | |
| 1076 | + * <p> Some operating systems do not support shared locks, in which case a | |
| 1077 | + * request for a shared lock is automatically converted into a request for | |
| 1078 | + * an exclusive lock. Whether the newly-acquired lock is shared or | |
| 1079 | + * exclusive may be tested by invoking the resulting lock object's {@link | |
| 1080 | + * FileLock#isShared() isShared} method. | |
| 1081 | + * | |
| 1082 | + * <p> File locks are held on behalf of the entire Java virtual machine. | |
| 1083 | + * They are not suitable for controlling access to a file by multiple | |
| 1084 | + * threads within the same virtual machine. </p> | |
| 1085 | + * | |
| 1086 | + * @param position | |
| 1087 | + * The position at which the locked region is to start; must be | |
| 1088 | + * non-negative | |
| 1089 | + * | |
| 1090 | + * @param size | |
| 1091 | + * The size of the locked region; must be non-negative, and the sum | |
| 1092 | + * <tt>position</tt> + <tt>size</tt> must be non-negative | |
| 1093 | + * | |
| 1094 | + * @param shared | |
| 1095 | + * <tt>true</tt> to request a shared lock, | |
| 1096 | + * <tt>false</tt> to request an exclusive lock | |
| 1097 | + * | |
| 1098 | + * @return A lock object representing the newly-acquired lock, | |
| 1099 | + * or <tt>null</tt> if the lock could not be acquired | |
| 1100 | + * because another program holds an overlapping lock | |
| 1101 | + * | |
| 1102 | + * @throws IllegalArgumentException | |
| 1103 | + * If the preconditions on the parameters do not hold | |
| 1104 | + * | |
| 1105 | + * @throws ClosedChannelException | |
| 1106 | + * If this channel is closed | |
| 1107 | + * | |
| 1108 | + * @throws OverlappingFileLockException | |
| 1109 | + * If a lock that overlaps the requested region is already held by | |
| 1110 | + * this Java virtual machine, or if another thread is already | |
| 1111 | + * blocked in this method and is attempting to lock an overlapping | |
| 1112 | + * region of the same file | |
| 1113 | + * | |
| 1114 | + * @throws IOException | |
| 1115 | + * If some other I/O error occurs | |
| 1116 | + * | |
| 1117 | + * @see #lock() | |
| 1118 | + * @see #lock(long,long,boolean) | |
| 1119 | + * @see #tryLock() | |
| 1120 | + */ | |
| 1121 | + public abstract FileLock tryLock(long position, long size, boolean shared) | |
| 1122 | + throws IOException; | |
| 1123 | + | |
| 1124 | + /** | |
| 1125 | + * Attempts to acquire an exclusive lock on this channel's file. | |
| 1126 | + * | |
| 1127 | + * <p> An invocation of this method of the form <tt>fc.tryLock()</tt> | |
| 1128 | + * behaves in exactly the same way as the invocation | |
| 1129 | + * | |
| 1130 | + * <pre> | |
| 1131 | + * fc.{@link #tryLock(long,long,boolean) tryLock}(0L, Long.MAX_VALUE, false) </pre> | |
| 1132 | + * | |
| 1133 | + * @return A lock object representing the newly-acquired lock, | |
| 1134 | + * or <tt>null</tt> if the lock could not be acquired | |
| 1135 | + * because another program holds an overlapping lock | |
| 1136 | + * | |
| 1137 | + * @throws ClosedChannelException | |
| 1138 | + * If this channel is closed | |
| 1139 | + * | |
| 1140 | + * @throws OverlappingFileLockException | |
| 1141 | + * If a lock that overlaps the requested region is already held by | |
| 1142 | + * this Java virtual machine, or if another thread is already | |
| 1143 | + * blocked in this method and is attempting to lock an overlapping | |
| 1144 | + * region | |
| 1145 | + * | |
| 1146 | + * @throws IOException | |
| 1147 | + * If some other I/O error occurs | |
| 1148 | + * | |
| 1149 | + * @see #lock() | |
| 1150 | + * @see #lock(long,long,boolean) | |
| 1151 | + * @see #tryLock(long,long,boolean) | |
| 1152 | + */ | |
| 1153 | + public final FileLock tryLock() throws IOException { | |
| 1154 | + return tryLock(0L, Long.MAX_VALUE, false); | |
| 1155 | + } | |
| 1156 | + | |
| 1157 | +} | |
Binary file not shown.
| @@ -0,0 +1,326 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2001, 2010, 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 | + | |
| 30 | +/** | |
| 31 | + * A token representing a lock on a region of a file. | |
| 32 | + * | |
| 33 | + * <p> A file-lock object is created each time a lock is acquired on a file via | |
| 34 | + * one of the {@link FileChannel#lock(long,long,boolean) lock} or {@link | |
| 35 | + * FileChannel#tryLock(long,long,boolean) tryLock} methods of the | |
| 36 | + * {@link FileChannel} class, or the {@link | |
| 37 | + * AsynchronousFileChannel#lock(long,long,boolean,Object,CompletionHandler) lock} | |
| 38 | + * or {@link AsynchronousFileChannel#tryLock(long,long,boolean) tryLock} | |
| 39 | + * methods of the {@link AsynchronousFileChannel} class. | |
| 40 | + * | |
| 41 | + * <p> A file-lock object is initially valid. It remains valid until the lock | |
| 42 | + * is released by invoking the {@link #release release} method, by closing the | |
| 43 | + * channel that was used to acquire it, or by the termination of the Java | |
| 44 | + * virtual machine, whichever comes first. The validity of a lock may be | |
| 45 | + * tested by invoking its {@link #isValid isValid} method. | |
| 46 | + * | |
| 47 | + * <p> A file lock is either <i>exclusive</i> or <i>shared</i>. A shared lock | |
| 48 | + * prevents other concurrently-running programs from acquiring an overlapping | |
| 49 | + * exclusive lock, but does allow them to acquire overlapping shared locks. An | |
| 50 | + * exclusive lock prevents other programs from acquiring an overlapping lock of | |
| 51 | + * either type. Once it is released, a lock has no further effect on the locks | |
| 52 | + * that may be acquired by other programs. | |
| 53 | + * | |
| 54 | + * <p> Whether a lock is exclusive or shared may be determined by invoking its | |
| 55 | + * {@link #isShared isShared} method. Some platforms do not support shared | |
| 56 | + * locks, in which case a request for a shared lock is automatically converted | |
| 57 | + * into a request for an exclusive lock. | |
| 58 | + * | |
| 59 | + * <p> The locks held on a particular file by a single Java virtual machine do | |
| 60 | + * not overlap. The {@link #overlaps overlaps} method may be used to test | |
| 61 | + * whether a candidate lock range overlaps an existing lock. | |
| 62 | + * | |
| 63 | + * <p> A file-lock object records the file channel upon whose file the lock is | |
| 64 | + * held, the type and validity of the lock, and the position and size of the | |
| 65 | + * locked region. Only the validity of a lock is subject to change over time; | |
| 66 | + * all other aspects of a lock's state are immutable. | |
| 67 | + * | |
| 68 | + * <p> File locks are held on behalf of the entire Java virtual machine. | |
| 69 | + * They are not suitable for controlling access to a file by multiple | |
| 70 | + * threads within the same virtual machine. | |
| 71 | + * | |
| 72 | + * <p> File-lock objects are safe for use by multiple concurrent threads. | |
| 73 | + * | |
| 74 | + * | |
| 75 | + * <a name="pdep"><h4> Platform dependencies </h4></a> | |
| 76 | + * | |
| 77 | + * <p> This file-locking API is intended to map directly to the native locking | |
| 78 | + * facility of the underlying operating system. Thus the locks held on a file | |
| 79 | + * should be visible to all programs that have access to the file, regardless | |
| 80 | + * of the language in which those programs are written. | |
| 81 | + * | |
| 82 | + * <p> Whether or not a lock actually prevents another program from accessing | |
| 83 | + * the content of the locked region is system-dependent and therefore | |
| 84 | + * unspecified. The native file-locking facilities of some systems are merely | |
| 85 | + * <i>advisory</i>, meaning that programs must cooperatively observe a known | |
| 86 | + * locking protocol in order to guarantee data integrity. On other systems | |
| 87 | + * native file locks are <i>mandatory</i>, meaning that if one program locks a | |
| 88 | + * region of a file then other programs are actually prevented from accessing | |
| 89 | + * that region in a way that would violate the lock. On yet other systems, | |
| 90 | + * whether native file locks are advisory or mandatory is configurable on a | |
| 91 | + * per-file basis. To ensure consistent and correct behavior across platforms, | |
| 92 | + * it is strongly recommended that the locks provided by this API be used as if | |
| 93 | + * they were advisory locks. | |
| 94 | + * | |
| 95 | + * <p> On some systems, acquiring a mandatory lock on a region of a file | |
| 96 | + * prevents that region from being {@link java.nio.channels.FileChannel#map | |
| 97 | + * <i>mapped into memory</i>}, and vice versa. Programs that combine | |
| 98 | + * locking and mapping should be prepared for this combination to fail. | |
| 99 | + * | |
| 100 | + * <p> On some systems, closing a channel releases all locks held by the Java | |
| 101 | + * virtual machine on the underlying file regardless of whether the locks were | |
| 102 | + * acquired via that channel or via another channel open on the same file. It | |
| 103 | + * is strongly recommended that, within a program, a unique channel be used to | |
| 104 | + * acquire all locks on any given file. | |
| 105 | + * | |
| 106 | + * <p> Some network filesystems permit file locking to be used with | |
| 107 | + * memory-mapped files only when the locked regions are page-aligned and a | |
| 108 | + * whole multiple of the underlying hardware's page size. Some network | |
| 109 | + * filesystems do not implement file locks on regions that extend past a | |
| 110 | + * certain position, often 2<sup>30</sup> or 2<sup>31</sup>. In general, great | |
| 111 | + * care should be taken when locking files that reside on network filesystems. | |
| 112 | + * | |
| 113 | + * | |
| 114 | + * @author Mark Reinhold | |
| 115 | + * @author JSR-51 Expert Group | |
| 116 | + * @since 1.4 | |
| 117 | + */ | |
| 118 | + | |
| 119 | +public abstract class FileLock implements AutoCloseable { | |
| 120 | + | |
| 121 | + private final Channel channel; | |
| 122 | + private final long position; | |
| 123 | + private final long size; | |
| 124 | + private final boolean shared; | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Initializes a new instance of this class. </p> | |
| 128 | + * | |
| 129 | + * @param channel | |
| 130 | + * The file channel upon whose file this lock is held | |
| 131 | + * | |
| 132 | + * @param position | |
| 133 | + * The position within the file at which the locked region starts; | |
| 134 | + * must be non-negative | |
| 135 | + * | |
| 136 | + * @param size | |
| 137 | + * The size of the locked region; must be non-negative, and the sum | |
| 138 | + * <tt>position</tt> + <tt>size</tt> must be non-negative | |
| 139 | + * | |
| 140 | + * @param shared | |
| 141 | + * <tt>true</tt> if this lock is shared, | |
| 142 | + * <tt>false</tt> if it is exclusive | |
| 143 | + * | |
| 144 | + * @throws IllegalArgumentException | |
| 145 | + * If the preconditions on the parameters do not hold | |
| 146 | + */ | |
| 147 | + protected FileLock(FileChannel channel, | |
| 148 | + long position, long size, boolean shared) | |
| 149 | + { | |
| 150 | + if (position < 0) | |
| 151 | + throw new IllegalArgumentException("Negative position"); | |
| 152 | + if (size < 0) | |
| 153 | + throw new IllegalArgumentException("Negative size"); | |
| 154 | + if (position + size < 0) | |
| 155 | + throw new IllegalArgumentException("Negative position + size"); | |
| 156 | + this.channel = channel; | |
| 157 | + this.position = position; | |
| 158 | + this.size = size; | |
| 159 | + this.shared = shared; | |
| 160 | + } | |
| 161 | + | |
| 162 | + /** | |
| 163 | + * Initializes a new instance of this class. | |
| 164 | + * | |
| 165 | + * @param channel | |
| 166 | + * The channel upon whose file this lock is held | |
| 167 | + * | |
| 168 | + * @param position | |
| 169 | + * The position within the file at which the locked region starts; | |
| 170 | + * must be non-negative | |
| 171 | + * | |
| 172 | + * @param size | |
| 173 | + * The size of the locked region; must be non-negative, and the sum | |
| 174 | + * <tt>position</tt> + <tt>size</tt> must be non-negative | |
| 175 | + * | |
| 176 | + * @param shared | |
| 177 | + * <tt>true</tt> if this lock is shared, | |
| 178 | + * <tt>false</tt> if it is exclusive | |
| 179 | + * | |
| 180 | + * @throws IllegalArgumentException | |
| 181 | + * If the preconditions on the parameters do not hold | |
| 182 | + * | |
| 183 | + * @since 1.7 | |
| 184 | + */ | |
| 185 | + protected FileLock(AsynchronousFileChannel channel, | |
| 186 | + long position, long size, boolean shared) | |
| 187 | + { | |
| 188 | + if (position < 0) | |
| 189 | + throw new IllegalArgumentException("Negative position"); | |
| 190 | + if (size < 0) | |
| 191 | + throw new IllegalArgumentException("Negative size"); | |
| 192 | + if (position + size < 0) | |
| 193 | + throw new IllegalArgumentException("Negative position + size"); | |
| 194 | + this.channel = channel; | |
| 195 | + this.position = position; | |
| 196 | + this.size = size; | |
| 197 | + this.shared = shared; | |
| 198 | + } | |
| 199 | + | |
| 200 | + /** | |
| 201 | + * Returns the file channel upon whose file this lock was acquired. | |
| 202 | + * | |
| 203 | + * <p> This method has been superseded by the {@link #acquiredBy acquiredBy} | |
| 204 | + * method. | |
| 205 | + * | |
| 206 | + * @return The file channel, or {@code null} if the file lock was not | |
| 207 | + * acquired by a file channel. | |
| 208 | + */ | |
| 209 | + public final FileChannel channel() { | |
| 210 | + return (channel instanceof FileChannel) ? (FileChannel)channel : null; | |
| 211 | + } | |
| 212 | + | |
| 213 | + /** | |
| 214 | + * Returns the channel upon whose file this lock was acquired. | |
| 215 | + * | |
| 216 | + * @return The channel upon whose file this lock was acquired. | |
| 217 | + * | |
| 218 | + * @since 1.7 | |
| 219 | + */ | |
| 220 | + public Channel acquiredBy() { | |
| 221 | + return channel; | |
| 222 | + } | |
| 223 | + | |
| 224 | + /** | |
| 225 | + * Returns the position within the file of the first byte of the locked | |
| 226 | + * region. | |
| 227 | + * | |
| 228 | + * <p> A locked region need not be contained within, or even overlap, the | |
| 229 | + * actual underlying file, so the value returned by this method may exceed | |
| 230 | + * the file's current size. </p> | |
| 231 | + * | |
| 232 | + * @return The position | |
| 233 | + */ | |
| 234 | + public final long position() { | |
| 235 | + return position; | |
| 236 | + } | |
| 237 | + | |
| 238 | + /** | |
| 239 | + * Returns the size of the locked region in bytes. | |
| 240 | + * | |
| 241 | + * <p> A locked region need not be contained within, or even overlap, the | |
| 242 | + * actual underlying file, so the value returned by this method may exceed | |
| 243 | + * the file's current size. </p> | |
| 244 | + * | |
| 245 | + * @return The size of the locked region | |
| 246 | + */ | |
| 247 | + public final long size() { | |
| 248 | + return size; | |
| 249 | + } | |
| 250 | + | |
| 251 | + /** | |
| 252 | + * Tells whether this lock is shared. </p> | |
| 253 | + * | |
| 254 | + * @return <tt>true</tt> if lock is shared, | |
| 255 | + * <tt>false</tt> if it is exclusive | |
| 256 | + */ | |
| 257 | + public final boolean isShared() { | |
| 258 | + return shared; | |
| 259 | + } | |
| 260 | + | |
| 261 | + /** | |
| 262 | + * Tells whether or not this lock overlaps the given lock range. </p> | |
| 263 | + * | |
| 264 | + * @return <tt>true</tt> if, and only if, this lock and the given lock | |
| 265 | + * range overlap by at least one byte | |
| 266 | + */ | |
| 267 | + public final boolean overlaps(long position, long size) { | |
| 268 | + if (position + size <= this.position) | |
| 269 | + return false; // That is below this | |
| 270 | + if (this.position + this.size <= position) | |
| 271 | + return false; // This is below that | |
| 272 | + return true; | |
| 273 | + } | |
| 274 | + | |
| 275 | + /** | |
| 276 | + * Tells whether or not this lock is valid. | |
| 277 | + * | |
| 278 | + * <p> A lock object remains valid until it is released or the associated | |
| 279 | + * file channel is closed, whichever comes first. </p> | |
| 280 | + * | |
| 281 | + * @return <tt>true</tt> if, and only if, this lock is valid | |
| 282 | + */ | |
| 283 | + public abstract boolean isValid(); | |
| 284 | + | |
| 285 | + /** | |
| 286 | + * Releases this lock. | |
| 287 | + * | |
| 288 | + * <p> If this lock object is valid then invoking this method releases the | |
| 289 | + * lock and renders the object invalid. If this lock object is invalid | |
| 290 | + * then invoking this method has no effect. </p> | |
| 291 | + * | |
| 292 | + * @throws ClosedChannelException | |
| 293 | + * If the channel that was used to acquire this lock | |
| 294 | + * is no longer open | |
| 295 | + * | |
| 296 | + * @throws IOException | |
| 297 | + * If an I/O error occurs | |
| 298 | + */ | |
| 299 | + public abstract void release() throws IOException; | |
| 300 | + | |
| 301 | + /** | |
| 302 | + * This method invokes the {@link #release} method. It was added | |
| 303 | + * to the class so that it could be used in conjunction with the | |
| 304 | + * automatic resource management block construct. | |
| 305 | + * | |
| 306 | + * @since 1.7 | |
| 307 | + */ | |
| 308 | + public final void close() throws IOException { | |
| 309 | + release(); | |
| 310 | + } | |
| 311 | + | |
| 312 | + /** | |
| 313 | + * Returns a string describing the range, type, and validity of this lock. | |
| 314 | + * | |
| 315 | + * @return A descriptive string | |
| 316 | + */ | |
| 317 | + public final String toString() { | |
| 318 | + return (this.getClass().getName() | |
| 319 | + + "[" + position | |
| 320 | + + ":" + size | |
| 321 | + + " " + (shared ? "shared" : "exclusive") | |
| 322 | + + " " + (isValid() ? "valid" : "invalid") | |
| 323 | + + "]"); | |
| 324 | + } | |
| 325 | + | |
| 326 | +} | |
Binary file not shown.
| @@ -0,0 +1,166 @@ | ||
| 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.ByteBuffer; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A channel that can write bytes from a sequence of buffers. | |
| 34 | + * | |
| 35 | + * <p> A <i>gathering</i> write operation writes, in a single invocation, a | |
| 36 | + * sequence of bytes from one or more of a given sequence of buffers. | |
| 37 | + * Gathering writes are often useful when implementing network protocols or | |
| 38 | + * file formats that, for example, group data into segments consisting of one | |
| 39 | + * or more fixed-length headers followed by a variable-length body. Similar | |
| 40 | + * <i>scattering</i> read operations are defined in the {@link | |
| 41 | + * ScatteringByteChannel} interface. </p> | |
| 42 | + * | |
| 43 | + * | |
| 44 | + * @author Mark Reinhold | |
| 45 | + * @author JSR-51 Expert Group | |
| 46 | + * @since 1.4 | |
| 47 | + */ | |
| 48 | + | |
| 49 | +public interface GatheringByteChannel | |
| 50 | + extends WritableByteChannel | |
| 51 | +{ | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Writes a sequence of bytes to this channel from a subsequence of the | |
| 55 | + * given buffers. | |
| 56 | + * | |
| 57 | + * <p> An attempt is made to write up to <i>r</i> bytes to this channel, | |
| 58 | + * where <i>r</i> is the total number of bytes remaining in the specified | |
| 59 | + * subsequence of the given buffer array, that is, | |
| 60 | + * | |
| 61 | + * <blockquote><pre> | |
| 62 | + * srcs[offset].remaining() | |
| 63 | + * + srcs[offset+1].remaining() | |
| 64 | + * + ... + srcs[offset+length-1].remaining()</pre></blockquote> | |
| 65 | + * | |
| 66 | + * at the moment that this method is invoked. | |
| 67 | + * | |
| 68 | + * <p> Suppose that a byte sequence of length <i>n</i> is written, where | |
| 69 | + * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 70 | + * Up to the first <tt>srcs[offset].remaining()</tt> bytes of this sequence | |
| 71 | + * are written from buffer <tt>srcs[offset]</tt>, up to the next | |
| 72 | + * <tt>srcs[offset+1].remaining()</tt> bytes are written from buffer | |
| 73 | + * <tt>srcs[offset+1]</tt>, and so forth, until the entire byte sequence is | |
| 74 | + * written. As many bytes as possible are written from each buffer, hence | |
| 75 | + * the final position of each updated buffer, except the last updated | |
| 76 | + * buffer, is guaranteed to be equal to that buffer's limit. | |
| 77 | + * | |
| 78 | + * <p> Unless otherwise specified, a write operation will return only after | |
| 79 | + * writing all of the <i>r</i> requested bytes. Some types of channels, | |
| 80 | + * depending upon their state, may write only some of the bytes or possibly | |
| 81 | + * none at all. A socket channel in non-blocking mode, for example, cannot | |
| 82 | + * write any more bytes than are free in the socket's output buffer. | |
| 83 | + * | |
| 84 | + * <p> This method may be invoked at any time. If another thread has | |
| 85 | + * already initiated a write operation upon this channel, however, then an | |
| 86 | + * invocation of this method will block until the first operation is | |
| 87 | + * complete. </p> | |
| 88 | + * | |
| 89 | + * @param srcs | |
| 90 | + * The buffers from which bytes are to be retrieved | |
| 91 | + * | |
| 92 | + * @param offset | |
| 93 | + * The offset within the buffer array of the first buffer from | |
| 94 | + * which bytes are to be retrieved; must be non-negative and no | |
| 95 | + * larger than <tt>srcs.length</tt> | |
| 96 | + * | |
| 97 | + * @param length | |
| 98 | + * The maximum number of buffers to be accessed; must be | |
| 99 | + * non-negative and no larger than | |
| 100 | + * <tt>srcs.length</tt> - <tt>offset</tt> | |
| 101 | + * | |
| 102 | + * @return The number of bytes written, possibly zero | |
| 103 | + * | |
| 104 | + * @throws IndexOutOfBoundsException | |
| 105 | + * If the preconditions on the <tt>offset</tt> and <tt>length</tt> | |
| 106 | + * parameters do not hold | |
| 107 | + * | |
| 108 | + * @throws NonWritableChannelException | |
| 109 | + * If this channel was not opened for writing | |
| 110 | + * | |
| 111 | + * @throws ClosedChannelException | |
| 112 | + * If this channel is closed | |
| 113 | + * | |
| 114 | + * @throws AsynchronousCloseException | |
| 115 | + * If another thread closes this channel | |
| 116 | + * while the write operation is in progress | |
| 117 | + * | |
| 118 | + * @throws ClosedByInterruptException | |
| 119 | + * If another thread interrupts the current thread | |
| 120 | + * while the write operation is in progress, thereby | |
| 121 | + * closing the channel and setting the current thread's | |
| 122 | + * interrupt status | |
| 123 | + * | |
| 124 | + * @throws IOException | |
| 125 | + * If some other I/O error occurs | |
| 126 | + */ | |
| 127 | + public long write(ByteBuffer[] srcs, int offset, int length) | |
| 128 | + throws IOException; | |
| 129 | + | |
| 130 | + | |
| 131 | + /** | |
| 132 | + * Writes a sequence of bytes to this channel from the given buffers. | |
| 133 | + * | |
| 134 | + * <p> An invocation of this method of the form <tt>c.write(srcs)</tt> | |
| 135 | + * behaves in exactly the same manner as the invocation | |
| 136 | + * | |
| 137 | + * <blockquote><pre> | |
| 138 | + * c.write(srcs, 0, srcs.length);</pre></blockquote> | |
| 139 | + * | |
| 140 | + * @param srcs | |
| 141 | + * The buffers from which bytes are to be retrieved | |
| 142 | + * | |
| 143 | + * @return The number of bytes written, possibly zero | |
| 144 | + * | |
| 145 | + * @throws NonWritableChannelException | |
| 146 | + * If this channel was not opened for writing | |
| 147 | + * | |
| 148 | + * @throws ClosedChannelException | |
| 149 | + * If this channel is closed | |
| 150 | + * | |
| 151 | + * @throws AsynchronousCloseException | |
| 152 | + * If another thread closes this channel | |
| 153 | + * while the write operation is in progress | |
| 154 | + * | |
| 155 | + * @throws ClosedByInterruptException | |
| 156 | + * If another thread interrupts the current thread | |
| 157 | + * while the write operation is in progress, thereby | |
| 158 | + * closing the channel and setting the current thread's | |
| 159 | + * interrupt status | |
| 160 | + * | |
| 161 | + * @throws IOException | |
| 162 | + * If some other I/O error occurs | |
| 163 | + */ | |
| 164 | + public long write(ByteBuffer[] srcs) throws IOException; | |
| 165 | + | |
| 166 | +} | |
Binary file not shown.
| @@ -0,0 +1,82 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 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 | +/* | |
| 27 | + */ | |
| 28 | + | |
| 29 | +package java.nio.channels; | |
| 30 | + | |
| 31 | +import java.io.IOException; | |
| 32 | + | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * A channel that can be asynchronously closed and interrupted. | |
| 36 | + * | |
| 37 | + * <p> A channel that implements this interface is <i>asynchronously | |
| 38 | + * closeable:</i> If a thread is blocked in an I/O operation on an | |
| 39 | + * interruptible channel then another thread may invoke the channel's {@link | |
| 40 | + * #close close} method. This will cause the blocked thread to receive an | |
| 41 | + * {@link AsynchronousCloseException}. | |
| 42 | + * | |
| 43 | + * <p> A channel that implements this interface is also <i>interruptible:</i> | |
| 44 | + * If a thread is blocked in an I/O operation on an interruptible channel then | |
| 45 | + * another thread may invoke the blocked thread's {@link Thread#interrupt() | |
| 46 | + * interrupt} method. This will cause the channel to be closed, the blocked | |
| 47 | + * thread to receive a {@link ClosedByInterruptException}, and the blocked | |
| 48 | + * thread's interrupt status to be set. | |
| 49 | + * | |
| 50 | + * <p> If a thread's interrupt status is already set and it invokes a blocking | |
| 51 | + * I/O operation upon a channel then the channel will be closed and the thread | |
| 52 | + * will immediately receive a {@link ClosedByInterruptException}; its interrupt | |
| 53 | + * status will remain set. | |
| 54 | + * | |
| 55 | + * <p> A channel supports asynchronous closing and interruption if, and only | |
| 56 | + * if, it implements this interface. This can be tested at runtime, if | |
| 57 | + * necessary, via the <tt>instanceof</tt> operator. | |
| 58 | + * | |
| 59 | + * | |
| 60 | + * @author Mark Reinhold | |
| 61 | + * @author JSR-51 Expert Group | |
| 62 | + * @since 1.4 | |
| 63 | + */ | |
| 64 | + | |
| 65 | +public interface InterruptibleChannel | |
| 66 | + extends Channel | |
| 67 | +{ | |
| 68 | + | |
| 69 | + /** | |
| 70 | + * Closes this channel. | |
| 71 | + * | |
| 72 | + * <p> Any thread currently blocked in an I/O operation upon this channel | |
| 73 | + * will receive an {@link AsynchronousCloseException}. | |
| 74 | + * | |
| 75 | + * <p> This method otherwise behaves exactly as specified by the {@link | |
| 76 | + * Channel#close Channel} interface. </p> | |
| 77 | + * | |
| 78 | + * @throws IOException If an I/O error occurs | |
| 79 | + */ | |
| 80 | + public void close() throws IOException; | |
| 81 | + | |
| 82 | +} | |
Binary file not shown.
| @@ -0,0 +1,177 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.net.InetAddress; | |
| 29 | +import java.net.NetworkInterface; | |
| 30 | +import java.io.IOException; | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A token representing the membership of an Internet Protocol (IP) multicast | |
| 34 | + * group. | |
| 35 | + * | |
| 36 | + * <p> A membership key may represent a membership to receive all datagrams sent | |
| 37 | + * to the group, or it may be <em>source-specific</em>, meaning that it | |
| 38 | + * represents a membership that receives only datagrams from a specific source | |
| 39 | + * address. Whether or not a membership key is source-specific may be determined | |
| 40 | + * by invoking its {@link #sourceAddress() sourceAddress} method. | |
| 41 | + * | |
| 42 | + * <p> A membership key is valid upon creation and remains valid until the | |
| 43 | + * membership is dropped by invoking the {@link #drop() drop} method, or | |
| 44 | + * the channel is closed. The validity of the membership key may be tested | |
| 45 | + * by invoking its {@link #isValid() isValid} method. | |
| 46 | + * | |
| 47 | + * <p> Where a membership key is not source-specific and the underlying operation | |
| 48 | + * system supports source filtering, then the {@link #block block} and {@link | |
| 49 | + * #unblock unblock} methods can be used to block or unblock multicast datagrams | |
| 50 | + * from particular source addresses. | |
| 51 | + * | |
| 52 | + * @see MulticastChannel | |
| 53 | + * | |
| 54 | + * @since 1.7 | |
| 55 | + */ | |
| 56 | +public abstract class MembershipKey { | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * Initializes a new instance of this class. | |
| 60 | + */ | |
| 61 | + protected MembershipKey() { | |
| 62 | + } | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Tells whether or not this membership is valid. | |
| 66 | + * | |
| 67 | + * <p> A multicast group membership is valid upon creation and remains | |
| 68 | + * valid until the membership is dropped by invoking the {@link #drop() drop} | |
| 69 | + * method, or the channel is closed. | |
| 70 | + * | |
| 71 | + * @return {@code true} if this membership key is valid, {@code false} | |
| 72 | + * otherwise | |
| 73 | + */ | |
| 74 | + public abstract boolean isValid(); | |
| 75 | + | |
| 76 | + /** | |
| 77 | + * Drop membership. | |
| 78 | + * | |
| 79 | + * <p> If the membership key represents a membership to receive all datagrams | |
| 80 | + * then the membership is dropped and the channel will no longer receive any | |
| 81 | + * datagrams sent to the group. If the membership key is source-specific | |
| 82 | + * then the channel will no longer receive datagrams sent to the group from | |
| 83 | + * that source address. | |
| 84 | + * | |
| 85 | + * <p> After membership is dropped it may still be possible to receive | |
| 86 | + * datagrams sent to the group. This can arise when datagrams are waiting to | |
| 87 | + * be received in the socket's receive buffer. After membership is dropped | |
| 88 | + * then the channel may {@link MulticastChannel#join join} the group again | |
| 89 | + * in which case a new membership key is returned. | |
| 90 | + * | |
| 91 | + * <p> Upon return, this membership object will be {@link #isValid() invalid}. | |
| 92 | + * If the multicast group membership is already invalid then invoking this | |
| 93 | + * method has no effect. Once a multicast group membership is invalid, | |
| 94 | + * it remains invalid forever. | |
| 95 | + */ | |
| 96 | + public abstract void drop(); | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * Block multicast datagrams from the given source address. | |
| 100 | + * | |
| 101 | + * <p> If this membership key is not source-specific, and the underlying | |
| 102 | + * operating system supports source filtering, then this method blocks | |
| 103 | + * multicast datagrams from the given source address. If the given source | |
| 104 | + * address is already blocked then this method has no effect. | |
| 105 | + * After a source address is blocked it may still be possible to receive | |
| 106 | + * datagams from that source. This can arise when datagrams are waiting to | |
| 107 | + * be received in the socket's receive buffer. | |
| 108 | + * | |
| 109 | + * @param source | |
| 110 | + * The source address to block | |
| 111 | + * | |
| 112 | + * @return This membership key | |
| 113 | + * | |
| 114 | + * @throws IllegalArgumentException | |
| 115 | + * If the {@code source} parameter is not a unicast address or | |
| 116 | + * is not the same address type as the multicast group | |
| 117 | + * @throws IllegalStateException | |
| 118 | + * If this membership key is source-specific or is no longer valid | |
| 119 | + * @throws UnsupportedOperationException | |
| 120 | + * If the underlying operating system does not support source | |
| 121 | + * filtering | |
| 122 | + * @throws IOException | |
| 123 | + * If an I/O error occurs | |
| 124 | + */ | |
| 125 | + public abstract MembershipKey block(InetAddress source) throws IOException; | |
| 126 | + | |
| 127 | + /** | |
| 128 | + * Unblock multicast datagrams from the given source address that was | |
| 129 | + * previously blocked using the {@link #block(InetAddress) block} method. | |
| 130 | + * | |
| 131 | + * @param source | |
| 132 | + * The source address to unblock | |
| 133 | + * | |
| 134 | + * @return This membership key | |
| 135 | + * | |
| 136 | + * @throws IllegalStateException | |
| 137 | + * If the given source address is not currently blocked or the | |
| 138 | + * membership key is no longer valid | |
| 139 | + */ | |
| 140 | + public abstract MembershipKey unblock(InetAddress source); | |
| 141 | + | |
| 142 | + /** | |
| 143 | + * Returns the channel for which this membership key was created. This | |
| 144 | + * method will continue to return the channel even after the membership | |
| 145 | + * becomes {@link #isValid invalid}. | |
| 146 | + * | |
| 147 | + * @return the channel | |
| 148 | + */ | |
| 149 | + public abstract MulticastChannel channel(); | |
| 150 | + | |
| 151 | + /** | |
| 152 | + * Returns the multicast group for which this membership key was created. | |
| 153 | + * This method will continue to return the group even after the membership | |
| 154 | + * becomes {@link #isValid invalid}. | |
| 155 | + * | |
| 156 | + * @return the multicast group | |
| 157 | + */ | |
| 158 | + public abstract InetAddress group(); | |
| 159 | + | |
| 160 | + /** | |
| 161 | + * Returns the network interface for which this membership key was created. | |
| 162 | + * This method will continue to return the network interface even after the | |
| 163 | + * membership becomes {@link #isValid invalid}. | |
| 164 | + * | |
| 165 | + * @return the network interface | |
| 166 | + */ | |
| 167 | + public abstract NetworkInterface networkInterface(); | |
| 168 | + | |
| 169 | + /** | |
| 170 | + * Returns the source address if this membership key is source-specific, | |
| 171 | + * or {@code null} if this membership is not source-specific. | |
| 172 | + * | |
| 173 | + * @return The source address if this membership key is source-specific, | |
| 174 | + * otherwise {@code null} | |
| 175 | + */ | |
| 176 | + public abstract InetAddress sourceAddress(); | |
| 177 | +} | |
Binary file not shown.
| @@ -0,0 +1,230 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.net.InetAddress; | |
| 29 | +import java.net.NetworkInterface; | |
| 30 | +import java.io.IOException; | |
| 31 | +import java.net.ProtocolFamily; // javadoc | |
| 32 | +import java.net.StandardProtocolFamily; // javadoc | |
| 33 | +import java.net.StandardSocketOptions; // javadoc | |
| 34 | + | |
| 35 | +/** | |
| 36 | + * A network channel that supports Internet Protocol (IP) multicasting. | |
| 37 | + * | |
| 38 | + * <p> IP multicasting is the transmission of IP datagrams to members of | |
| 39 | + * a <em>group</em> that is zero or more hosts identified by a single destination | |
| 40 | + * address. | |
| 41 | + * | |
| 42 | + * <p> In the case of a channel to an {@link StandardProtocolFamily#INET IPv4} socket, | |
| 43 | + * the underlying operating system supports <a href="http://www.ietf.org/rfc/rfc2236.txt"> | |
| 44 | + * <i>RFC 2236: Internet Group Management Protocol, Version 2 (IGMPv2)</i></a>. | |
| 45 | + * It may optionally support source filtering as specified by <a | |
| 46 | + * href="http://www.ietf.org/rfc/rfc3376.txt"> <i>RFC 3376: Internet Group | |
| 47 | + * Management Protocol, Version 3 (IGMPv3)</i></a>. | |
| 48 | + * For channels to an {@link StandardProtocolFamily#INET6 IPv6} socket, the equivalent | |
| 49 | + * standards are <a href="http://www.ietf.org/rfc/rfc2710.txt"> <i>RFC 2710: | |
| 50 | + * Multicast Listener Discovery (MLD) for IPv6</i></a> and <a | |
| 51 | + * href="http://www.ietf.org/rfc/rfc3810.txt"> <i>RFC 3810: Multicast Listener | |
| 52 | + * Discovery Version 2 (MLDv2) for IPv6</i></a>. | |
| 53 | + * | |
| 54 | + * <p> The {@link #join(InetAddress,NetworkInterface)} method is used to | |
| 55 | + * join a group and receive all multicast datagrams sent to the group. A channel | |
| 56 | + * may join several multicast groups and may join the same group on several | |
| 57 | + * {@link NetworkInterface interfaces}. Membership is dropped by invoking the {@link | |
| 58 | + * MembershipKey#drop drop} method on the returned {@link MembershipKey}. If the | |
| 59 | + * underlying platform supports source filtering then the {@link MembershipKey#block | |
| 60 | + * block} and {@link MembershipKey#unblock unblock} methods can be used to block or | |
| 61 | + * unblock multicast datagrams from particular source addresses. | |
| 62 | + * | |
| 63 | + * <p> The {@link #join(InetAddress,NetworkInterface,InetAddress)} method | |
| 64 | + * is used to begin receiving datagrams sent to a group whose source address matches | |
| 65 | + * a given source address. This method throws {@link UnsupportedOperationException} | |
| 66 | + * if the underlying platform does not support source filtering. Membership is | |
| 67 | + * <em>cumulative</em> and this method may be invoked again with the same group | |
| 68 | + * and interface to allow receiving datagrams from other source addresses. The | |
| 69 | + * method returns a {@link MembershipKey} that represents membership to receive | |
| 70 | + * datagrams from the given source address. Invoking the key's {@link | |
| 71 | + * MembershipKey#drop drop} method drops membership so that datagrams from the | |
| 72 | + * source address can no longer be received. | |
| 73 | + * | |
| 74 | + * <h4>Platform dependencies</h4> | |
| 75 | + * | |
| 76 | + * The multicast implementation is intended to map directly to the native | |
| 77 | + * multicasting facility. Consequently, the following items should be considered | |
| 78 | + * when developing an application that receives IP multicast datagrams: | |
| 79 | + * | |
| 80 | + * <ol> | |
| 81 | + * | |
| 82 | + * <li><p> The creation of the channel should specify the {@link ProtocolFamily} | |
| 83 | + * that corresponds to the address type of the multicast groups that the channel | |
| 84 | + * will join. There is no guarantee that a channel to a socket in one protocol | |
| 85 | + * family can join and receive multicast datagrams when the address of the | |
| 86 | + * multicast group corresponds to another protocol family. For example, it is | |
| 87 | + * implementation specific if a channel to an {@link StandardProtocolFamily#INET6 IPv6} | |
| 88 | + * socket can join an {@link StandardProtocolFamily#INET IPv4} multicast group and receive | |
| 89 | + * multicast datagrams sent to the group. </p></li> | |
| 90 | + * | |
| 91 | + * <li><p> The channel's socket should be bound to the {@link | |
| 92 | + * InetAddress#isAnyLocalAddress wildcard} address. If the socket is bound to | |
| 93 | + * a specific address, rather than the wildcard address then it is implementation | |
| 94 | + * specific if multicast datagrams are received by the socket. </p></li> | |
| 95 | + * | |
| 96 | + * <li><p> The {@link StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} option should be | |
| 97 | + * enabled prior to {@link NetworkChannel#bind binding} the socket. This is | |
| 98 | + * required to allow multiple members of the group to bind to the same | |
| 99 | + * address. </p></li> | |
| 100 | + * | |
| 101 | + * </ol> | |
| 102 | + * | |
| 103 | + * <p> <b>Usage Example:</b> | |
| 104 | + * <pre> | |
| 105 | + * // join multicast group on this interface, and also use this | |
| 106 | + * // interface for outgoing multicast datagrams | |
| 107 | + * NetworkInterface ni = NetworkInterface.getByName("hme0"); | |
| 108 | + * | |
| 109 | + * DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) | |
| 110 | + * .setOption(StandardSocketOptions.SO_REUSEADDR, true) | |
| 111 | + * .bind(new InetSocketAddress(5000)) | |
| 112 | + * .setOption(StandardSocketOptions.IP_MULTICAST_IF, ni); | |
| 113 | + * | |
| 114 | + * InetAddress group = InetAddress.getByName("225.4.5.6"); | |
| 115 | + * | |
| 116 | + * MembershipKey key = dc.join(group, ni); | |
| 117 | + * </pre> | |
| 118 | + * | |
| 119 | + * @since 1.7 | |
| 120 | + */ | |
| 121 | + | |
| 122 | +public interface MulticastChannel | |
| 123 | + extends NetworkChannel | |
| 124 | +{ | |
| 125 | + /** | |
| 126 | + * Closes this channel. | |
| 127 | + * | |
| 128 | + * <p> If the channel is a member of a multicast group then the membership | |
| 129 | + * is {@link MembershipKey#drop dropped}. Upon return, the {@link | |
| 130 | + * MembershipKey membership-key} will be {@link MembershipKey#isValid | |
| 131 | + * invalid}. | |
| 132 | + * | |
| 133 | + * <p> This method otherwise behaves exactly as specified by the {@link | |
| 134 | + * Channel} interface. | |
| 135 | + * | |
| 136 | + * @throws IOException | |
| 137 | + * If an I/O error occurs | |
| 138 | + */ | |
| 139 | + @Override void close() throws IOException; | |
| 140 | + | |
| 141 | + /** | |
| 142 | + * Joins a multicast group to begin receiving all datagrams sent to the group, | |
| 143 | + * returning a membership key. | |
| 144 | + * | |
| 145 | + * <p> If this channel is currently a member of the group on the given | |
| 146 | + * interface to receive all datagrams then the membership key, representing | |
| 147 | + * that membership, is returned. Otherwise this channel joins the group and | |
| 148 | + * the resulting new membership key is returned. The resulting membership key | |
| 149 | + * is not {@link MembershipKey#sourceAddress source-specific}. | |
| 150 | + * | |
| 151 | + * <p> A multicast channel may join several multicast groups, including | |
| 152 | + * the same group on more than one interface. An implementation may impose a | |
| 153 | + * limit on the number of groups that may be joined at the same time. | |
| 154 | + * | |
| 155 | + * @param group | |
| 156 | + * The multicast address to join | |
| 157 | + * @param interf | |
| 158 | + * The network interface on which to join the group | |
| 159 | + * | |
| 160 | + * @return The membership key | |
| 161 | + * | |
| 162 | + * @throws IllegalArgumentException | |
| 163 | + * If the group parameter is not a {@link InetAddress#isMulticastAddress | |
| 164 | + * multicast} address, or the group parameter is an address type | |
| 165 | + * that is not supported by this channel | |
| 166 | + * @throws IllegalStateException | |
| 167 | + * If the channel already has source-specific membership of the | |
| 168 | + * group on the interface | |
| 169 | + * @throws UnsupportedOperationException | |
| 170 | + * If the channel's socket is not an Internet Protocol socket | |
| 171 | + * @throws ClosedChannelException | |
| 172 | + * If this channel is closed | |
| 173 | + * @throws IOException | |
| 174 | + * If an I/O error occurs | |
| 175 | + * @throws SecurityException | |
| 176 | + * If a security manager is set, and its | |
| 177 | + * {@link SecurityManager#checkMulticast(InetAddress) checkMulticast} | |
| 178 | + * method denies access to the multiast group | |
| 179 | + */ | |
| 180 | + MembershipKey join(InetAddress group, NetworkInterface interf) | |
| 181 | + throws IOException; | |
| 182 | + | |
| 183 | + /** | |
| 184 | + * Joins a multicast group to begin receiving datagrams sent to the group | |
| 185 | + * from a given source address. | |
| 186 | + * | |
| 187 | + * <p> If this channel is currently a member of the group on the given | |
| 188 | + * interface to receive datagrams from the given source address then the | |
| 189 | + * membership key, representing that membership, is returned. Otherwise this | |
| 190 | + * channel joins the group and the resulting new membership key is returned. | |
| 191 | + * The resulting membership key is {@link MembershipKey#sourceAddress | |
| 192 | + * source-specific}. | |
| 193 | + * | |
| 194 | + * <p> Membership is <em>cumulative</em> and this method may be invoked | |
| 195 | + * again with the same group and interface to allow receiving datagrams sent | |
| 196 | + * by other source addresses to the group. | |
| 197 | + * | |
| 198 | + * @param group | |
| 199 | + * The multicast address to join | |
| 200 | + * @param interf | |
| 201 | + * The network interface on which to join the group | |
| 202 | + * @param source | |
| 203 | + * The source address | |
| 204 | + * | |
| 205 | + * @return The membership key | |
| 206 | + * | |
| 207 | + * @throws IllegalArgumentException | |
| 208 | + * If the group parameter is not a {@link | |
| 209 | + * InetAddress#isMulticastAddress multicast} address, the | |
| 210 | + * source parameter is not a unicast address, the group | |
| 211 | + * parameter is an address type that is not supported by this channel, | |
| 212 | + * or the source parameter is not the same address type as the group | |
| 213 | + * @throws IllegalStateException | |
| 214 | + * If the channel is currently a member of the group on the given | |
| 215 | + * interface to receive all datagrams | |
| 216 | + * @throws UnsupportedOperationException | |
| 217 | + * If the channel's socket is not an Internet Protocol socket or | |
| 218 | + * source filtering is not supported | |
| 219 | + * @throws ClosedChannelException | |
| 220 | + * If this channel is closed | |
| 221 | + * @throws IOException | |
| 222 | + * If an I/O error occurs | |
| 223 | + * @throws SecurityException | |
| 224 | + * If a security manager is set, and its | |
| 225 | + * {@link SecurityManager#checkMulticast(InetAddress) checkMulticast} | |
| 226 | + * method denies access to the multiast group | |
| 227 | + */ | |
| 228 | + MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source) | |
| 229 | + throws IOException; | |
| 230 | +} | |
Binary file not shown.
| @@ -0,0 +1,160 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2009, 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.net.SocketOption; | |
| 29 | +import java.net.SocketAddress; | |
| 30 | +import java.util.Set; | |
| 31 | +import java.io.IOException; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * A channel to a network socket. | |
| 35 | + * | |
| 36 | + * <p> A channel that implements this interface is a channel to a network | |
| 37 | + * socket. The {@link #bind(SocketAddress) bind} method is used to bind the | |
| 38 | + * socket to a local {@link SocketAddress address}, the {@link #getLocalAddress() | |
| 39 | + * getLocalAddress} method returns the address that the socket is bound to, and | |
| 40 | + * the {@link #setOption(SocketOption,Object) setOption} and {@link | |
| 41 | + * #getOption(SocketOption) getOption} methods are used to set and query socket | |
| 42 | + * options. An implementation of this interface should specify the socket options | |
| 43 | + * that it supports. | |
| 44 | + * | |
| 45 | + * <p> The {@link #bind bind} and {@link #setOption setOption} methods that do | |
| 46 | + * not otherwise have a value to return are specified to return the network | |
| 47 | + * channel upon which they are invoked. This allows method invocations to be | |
| 48 | + * chained. Implementations of this interface should specialize the return type | |
| 49 | + * so that method invocations on the implementation class can be chained. | |
| 50 | + * | |
| 51 | + * @since 1.7 | |
| 52 | + */ | |
| 53 | + | |
| 54 | +public interface NetworkChannel | |
| 55 | + extends Channel | |
| 56 | +{ | |
| 57 | + /** | |
| 58 | + * Binds the channel's socket to a local address. | |
| 59 | + * | |
| 60 | + * <p> This method is used to establish an association between the socket and | |
| 61 | + * a local address. Once an association is established then the socket remains | |
| 62 | + * bound until the channel is closed. If the {@code local} parameter has the | |
| 63 | + * value {@code null} then the socket will be bound to an address that is | |
| 64 | + * assigned automatically. | |
| 65 | + * | |
| 66 | + * @param local | |
| 67 | + * The address to bind the socket, or {@code null} to bind the socket | |
| 68 | + * to an automatically assigned socket address | |
| 69 | + * | |
| 70 | + * @return This channel | |
| 71 | + * | |
| 72 | + * @throws AlreadyBoundException | |
| 73 | + * If the socket is already bound | |
| 74 | + * @throws UnsupportedAddressTypeException | |
| 75 | + * If the type of the given address is not supported | |
| 76 | + * @throws ClosedChannelException | |
| 77 | + * If the channel is closed | |
| 78 | + * @throws IOException | |
| 79 | + * If some other I/O error occurs | |
| 80 | + * @throws SecurityException | |
| 81 | + * If a security manager is installed and it denies an unspecified | |
| 82 | + * permission. An implementation of this interface should specify | |
| 83 | + * any required permissions. | |
| 84 | + * | |
| 85 | + * @see #getLocalAddress | |
| 86 | + */ | |
| 87 | + NetworkChannel bind(SocketAddress local) throws IOException; | |
| 88 | + | |
| 89 | + /** | |
| 90 | + * Returns the socket address that this channel's socket is bound to, or | |
| 91 | + * {@code null} if the socket is not bound. | |
| 92 | + * | |
| 93 | + * <p> Where the channel is {@link #bind bound} to an Internet Protocol | |
| 94 | + * socket address then the return value from this method is of type {@link | |
| 95 | + * java.net.InetSocketAddress}. | |
| 96 | + * | |
| 97 | + * @return The socket address that the socket is bound to, or {@code null} | |
| 98 | + * if the channel's socket is not bound | |
| 99 | + * | |
| 100 | + * @throws ClosedChannelException | |
| 101 | + * If the channel is closed | |
| 102 | + * @throws IOException | |
| 103 | + * If an I/O error occurs | |
| 104 | + */ | |
| 105 | + SocketAddress getLocalAddress() throws IOException; | |
| 106 | + | |
| 107 | + /** | |
| 108 | + * Sets the value of a socket option. | |
| 109 | + * | |
| 110 | + * @param name | |
| 111 | + * The socket option | |
| 112 | + * @param value | |
| 113 | + * The value of the socket option. A value of {@code null} may be | |
| 114 | + * a valid value for some socket options. | |
| 115 | + * | |
| 116 | + * @return This channel | |
| 117 | + * | |
| 118 | + * @throws UnsupportedOperationException | |
| 119 | + * If the socket option is not supported by this channel | |
| 120 | + * @throws IllegalArgumentException | |
| 121 | + * If the value is not a valid value for this socket option | |
| 122 | + * @throws ClosedChannelException | |
| 123 | + * If this channel is closed | |
| 124 | + * @throws IOException | |
| 125 | + * If an I/O error occurs | |
| 126 | + * | |
| 127 | + * @see java.net.StandardSocketOptions | |
| 128 | + */ | |
| 129 | + <T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException; | |
| 130 | + | |
| 131 | + /** | |
| 132 | + * Returns the value of a socket option. | |
| 133 | + * | |
| 134 | + * @param name | |
| 135 | + * The socket option | |
| 136 | + * | |
| 137 | + * @return The value of the socket option. A value of {@code null} may be | |
| 138 | + * a valid value for some socket options. | |
| 139 | + * | |
| 140 | + * @throws UnsupportedOperationException | |
| 141 | + * If the socket option is not supported by this channel | |
| 142 | + * @throws ClosedChannelException | |
| 143 | + * If this channel is closed | |
| 144 | + * @throws IOException | |
| 145 | + * If an I/O error occurs | |
| 146 | + * | |
| 147 | + * @see java.net.StandardSocketOptions | |
| 148 | + */ | |
| 149 | + <T> T getOption(SocketOption<T> name) throws IOException; | |
| 150 | + | |
| 151 | + /** | |
| 152 | + * Returns a set of the socket options supported by this channel. | |
| 153 | + * | |
| 154 | + * <p> This method will continue to return the set of options even after the | |
| 155 | + * channel has been closed. | |
| 156 | + * | |
| 157 | + * @return A set of the socket options supported by this channel | |
| 158 | + */ | |
| 159 | + Set<SocketOption<?>> supportedOptions(); | |
| 160 | +} | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,153 @@ | ||
| 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 | + */ | |
| 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 | + */ | |
| 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 | + */ | |
| 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 | + */ | |
| 111 | + public final int validOps() { | |
| 112 | + return SelectionKey.OP_WRITE; | |
| 113 | + } | |
| 114 | + | |
| 115 | + } | |
| 116 | + | |
| 117 | + /** | |
| 118 | + * Initializes a new instance of this class. | |
| 119 | + */ | |
| 120 | + protected Pipe() { } | |
| 121 | + | |
| 122 | + /** | |
| 123 | + * Returns this pipe's source channel. </p> | |
| 124 | + * | |
| 125 | + * @return This pipe's source channel | |
| 126 | + */ | |
| 127 | + public abstract SourceChannel source(); | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * Returns this pipe's sink channel. </p> | |
| 131 | + * | |
| 132 | + * @return This pipe's sink channel | |
| 133 | + */ | |
| 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 | + */ | |
| 149 | + public static Pipe open() throws IOException { | |
| 150 | + return SelectorProvider.provider().openPipe(); | |
| 151 | + } | |
| 152 | + | |
| 153 | +} | |
Binary file not shown.
| @@ -0,0 +1,108 @@ | ||
| 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.ByteBuffer; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A channel that can read bytes. | |
| 34 | + * | |
| 35 | + * <p> Only one read operation upon a readable channel may be in progress at | |
| 36 | + * any given time. If one thread initiates a read operation upon a channel | |
| 37 | + * then any other thread that attempts to initiate another read operation will | |
| 38 | + * block until the first operation is complete. Whether or not other kinds of | |
| 39 | + * I/O operations may proceed concurrently with a read operation depends upon | |
| 40 | + * the type of the channel. </p> | |
| 41 | + * | |
| 42 | + * | |
| 43 | + * @author Mark Reinhold | |
| 44 | + * @author JSR-51 Expert Group | |
| 45 | + * @since 1.4 | |
| 46 | + */ | |
| 47 | + | |
| 48 | +public interface ReadableByteChannel extends Channel { | |
| 49 | + | |
| 50 | + /** | |
| 51 | + * Reads a sequence of bytes from this channel into the given buffer. | |
| 52 | + * | |
| 53 | + * <p> An attempt is made to read up to <i>r</i> bytes from the channel, | |
| 54 | + * where <i>r</i> is the number of bytes remaining in the buffer, that is, | |
| 55 | + * <tt>dst.remaining()</tt>, at the moment this method is invoked. | |
| 56 | + * | |
| 57 | + * <p> Suppose that a byte sequence of length <i>n</i> is read, where | |
| 58 | + * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 59 | + * This byte sequence will be transferred into the buffer so that the first | |
| 60 | + * byte in the sequence is at index <i>p</i> and the last byte is at index | |
| 61 | + * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>, | |
| 62 | + * where <i>p</i> is the buffer's position at the moment this method is | |
| 63 | + * invoked. Upon return the buffer's position will be equal to | |
| 64 | + * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. | |
| 65 | + * | |
| 66 | + * <p> A read operation might not fill the buffer, and in fact it might not | |
| 67 | + * read any bytes at all. Whether or not it does so depends upon the | |
| 68 | + * nature and state of the channel. A socket channel in non-blocking mode, | |
| 69 | + * for example, cannot read any more bytes than are immediately available | |
| 70 | + * from the socket's input buffer; similarly, a file channel cannot read | |
| 71 | + * any more bytes than remain in the file. It is guaranteed, however, that | |
| 72 | + * if a channel is in blocking mode and there is at least one byte | |
| 73 | + * remaining in the buffer then this method will block until at least one | |
| 74 | + * byte is read. | |
| 75 | + * | |
| 76 | + * <p> This method may be invoked at any time. If another thread has | |
| 77 | + * already initiated a read operation upon this channel, however, then an | |
| 78 | + * invocation of this method will block until the first operation is | |
| 79 | + * complete. </p> | |
| 80 | + * | |
| 81 | + * @param dst | |
| 82 | + * The buffer into which bytes are to be transferred | |
| 83 | + * | |
| 84 | + * @return The number of bytes read, possibly zero, or <tt>-1</tt> if the | |
| 85 | + * channel has reached end-of-stream | |
| 86 | + * | |
| 87 | + * @throws NonReadableChannelException | |
| 88 | + * If this channel was not opened for reading | |
| 89 | + * | |
| 90 | + * @throws ClosedChannelException | |
| 91 | + * If this channel is closed | |
| 92 | + * | |
| 93 | + * @throws AsynchronousCloseException | |
| 94 | + * If another thread closes this channel | |
| 95 | + * while the read operation is in progress | |
| 96 | + * | |
| 97 | + * @throws ClosedByInterruptException | |
| 98 | + * If another thread interrupts the current thread | |
| 99 | + * while the read operation is in progress, thereby | |
| 100 | + * closing the channel and setting the current thread's | |
| 101 | + * interrupt status | |
| 102 | + * | |
| 103 | + * @throws IOException | |
| 104 | + * If some other I/O error occurs | |
| 105 | + */ | |
| 106 | + public int read(ByteBuffer dst) throws IOException; | |
| 107 | + | |
| 108 | +} | |
Binary file not shown.
| @@ -0,0 +1,162 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2006, 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.ByteBuffer; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A channel that can read bytes into a sequence of buffers. | |
| 34 | + * | |
| 35 | + * <p> A <i>scattering</i> read operation reads, in a single invocation, a | |
| 36 | + * sequence of bytes into one or more of a given sequence of buffers. | |
| 37 | + * Scattering reads are often useful when implementing network protocols or | |
| 38 | + * file formats that, for example, group data into segments consisting of one | |
| 39 | + * or more fixed-length headers followed by a variable-length body. Similar | |
| 40 | + * <i>gathering</i> write operations are defined in the {@link | |
| 41 | + * GatheringByteChannel} interface. </p> | |
| 42 | + * | |
| 43 | + * | |
| 44 | + * @author Mark Reinhold | |
| 45 | + * @author JSR-51 Expert Group | |
| 46 | + * @since 1.4 | |
| 47 | + */ | |
| 48 | + | |
| 49 | +public interface ScatteringByteChannel | |
| 50 | + extends ReadableByteChannel | |
| 51 | +{ | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Reads a sequence of bytes from this channel into a subsequence of the | |
| 55 | + * given buffers. | |
| 56 | + * | |
| 57 | + * <p> An invocation of this method attempts to read up to <i>r</i> bytes | |
| 58 | + * from this channel, where <i>r</i> is the total number of bytes remaining | |
| 59 | + * the specified subsequence of the given buffer array, that is, | |
| 60 | + * | |
| 61 | + * <blockquote><pre> | |
| 62 | + * dsts[offset].remaining() | |
| 63 | + * + dsts[offset+1].remaining() | |
| 64 | + * + ... + dsts[offset+length-1].remaining()</pre></blockquote> | |
| 65 | + * | |
| 66 | + * at the moment that this method is invoked. | |
| 67 | + * | |
| 68 | + * <p> Suppose that a byte sequence of length <i>n</i> is read, where | |
| 69 | + * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 70 | + * Up to the first <tt>dsts[offset].remaining()</tt> bytes of this sequence | |
| 71 | + * are transferred into buffer <tt>dsts[offset]</tt>, up to the next | |
| 72 | + * <tt>dsts[offset+1].remaining()</tt> bytes are transferred into buffer | |
| 73 | + * <tt>dsts[offset+1]</tt>, and so forth, until the entire byte sequence | |
| 74 | + * is transferred into the given buffers. As many bytes as possible are | |
| 75 | + * transferred into each buffer, hence the final position of each updated | |
| 76 | + * buffer, except the last updated buffer, is guaranteed to be equal to | |
| 77 | + * that buffer's limit. | |
| 78 | + * | |
| 79 | + * <p> This method may be invoked at any time. If another thread has | |
| 80 | + * already initiated a read operation upon this channel, however, then an | |
| 81 | + * invocation of this method will block until the first operation is | |
| 82 | + * complete. </p> | |
| 83 | + * | |
| 84 | + * @param dsts | |
| 85 | + * The buffers into which bytes are to be transferred | |
| 86 | + * | |
| 87 | + * @param offset | |
| 88 | + * The offset within the buffer array of the first buffer into | |
| 89 | + * which bytes are to be transferred; must be non-negative and no | |
| 90 | + * larger than <tt>dsts.length</tt> | |
| 91 | + * | |
| 92 | + * @param length | |
| 93 | + * The maximum number of buffers to be accessed; must be | |
| 94 | + * non-negative and no larger than | |
| 95 | + * <tt>dsts.length</tt> - <tt>offset</tt> | |
| 96 | + * | |
| 97 | + * @return The number of bytes read, possibly zero, | |
| 98 | + * or <tt>-1</tt> if the channel has reached end-of-stream | |
| 99 | + * | |
| 100 | + * @throws IndexOutOfBoundsException | |
| 101 | + * If the preconditions on the <tt>offset</tt> and <tt>length</tt> | |
| 102 | + * parameters do not hold | |
| 103 | + * | |
| 104 | + * @throws NonReadableChannelException | |
| 105 | + * If this channel was not opened for reading | |
| 106 | + * | |
| 107 | + * @throws ClosedChannelException | |
| 108 | + * If this channel is closed | |
| 109 | + * | |
| 110 | + * @throws AsynchronousCloseException | |
| 111 | + * If another thread closes this channel | |
| 112 | + * while the read operation is in progress | |
| 113 | + * | |
| 114 | + * @throws ClosedByInterruptException | |
| 115 | + * If another thread interrupts the current thread | |
| 116 | + * while the read operation is in progress, thereby | |
| 117 | + * closing the channel and setting the current thread's | |
| 118 | + * interrupt status | |
| 119 | + * | |
| 120 | + * @throws IOException | |
| 121 | + * If some other I/O error occurs | |
| 122 | + */ | |
| 123 | + public long read(ByteBuffer[] dsts, int offset, int length) | |
| 124 | + throws IOException; | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Reads a sequence of bytes from this channel into the given buffers. | |
| 128 | + * | |
| 129 | + * <p> An invocation of this method of the form <tt>c.read(dsts)</tt> | |
| 130 | + * behaves in exactly the same manner as the invocation | |
| 131 | + * | |
| 132 | + * <blockquote><pre> | |
| 133 | + * c.read(dsts, 0, dsts.length);</pre></blockquote> | |
| 134 | + * | |
| 135 | + * @param dsts | |
| 136 | + * The buffers into which bytes are to be transferred | |
| 137 | + * | |
| 138 | + * @return The number of bytes read, possibly zero, | |
| 139 | + * or <tt>-1</tt> if the channel has reached end-of-stream | |
| 140 | + * | |
| 141 | + * @throws NonReadableChannelException | |
| 142 | + * If this channel was not opened for reading | |
| 143 | + * | |
| 144 | + * @throws ClosedChannelException | |
| 145 | + * If this channel is closed | |
| 146 | + * | |
| 147 | + * @throws AsynchronousCloseException | |
| 148 | + * If another thread closes this channel | |
| 149 | + * while the read operation is in progress | |
| 150 | + * | |
| 151 | + * @throws ClosedByInterruptException | |
| 152 | + * If another thread interrupts the current thread | |
| 153 | + * while the read operation is in progress, thereby | |
| 154 | + * closing the channel and setting the current thread's | |
| 155 | + * interrupt status | |
| 156 | + * | |
| 157 | + * @throws IOException | |
| 158 | + * If some other I/O error occurs | |
| 159 | + */ | |
| 160 | + public long read(ByteBuffer[] dsts) throws IOException; | |
| 161 | + | |
| 162 | +} | |
Binary file not shown.
| @@ -0,0 +1,168 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2011, 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.nio.ByteBuffer; | |
| 29 | +import java.io.IOException; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * A byte channel that maintains a current <i>position</i> and allows the | |
| 33 | + * position to be changed. | |
| 34 | + * | |
| 35 | + * <p> A seekable byte channel is connected to an entity, typically a file, | |
| 36 | + * that contains a variable-length sequence of bytes that can be read and | |
| 37 | + * written. The current position can be {@link #position() <i>queried</i>} and | |
| 38 | + * {@link #position(long) <i>modified</i>}. The channel also provides access to | |
| 39 | + * the current <i>size</i> of the entity to which the channel is connected. The | |
| 40 | + * size increases when bytes are written beyond its current size; the size | |
| 41 | + * decreases when it is {@link #truncate <i>truncated</i>}. | |
| 42 | + * | |
| 43 | + * <p> The {@link #position(long) position} and {@link #truncate truncate} methods | |
| 44 | + * which do not otherwise have a value to return are specified to return the | |
| 45 | + * channel upon which they are invoked. This allows method invocations to be | |
| 46 | + * chained. Implementations of this interface should specialize the return type | |
| 47 | + * so that method invocations on the implementation class can be chained. | |
| 48 | + * | |
| 49 | + * @since 1.7 | |
| 50 | + * @see java.nio.file.Files#newByteChannel | |
| 51 | + */ | |
| 52 | + | |
| 53 | +public interface SeekableByteChannel | |
| 54 | + extends ByteChannel | |
| 55 | +{ | |
| 56 | + /** | |
| 57 | + * Reads a sequence of bytes from this channel into the given buffer. | |
| 58 | + * | |
| 59 | + * <p> Bytes are read starting at this channel's current position, and | |
| 60 | + * then the position is updated with the number of bytes actually read. | |
| 61 | + * Otherwise this method behaves exactly as specified in the {@link | |
| 62 | + * ReadableByteChannel} interface. | |
| 63 | + */ | |
| 64 | + @Override | |
| 65 | + int read(ByteBuffer dst) throws IOException; | |
| 66 | + | |
| 67 | + /** | |
| 68 | + * Writes a sequence of bytes to this channel from the given buffer. | |
| 69 | + * | |
| 70 | + * <p> Bytes are written starting at this channel's current position, unless | |
| 71 | + * the channel is connected to an entity such as a file that is opened with | |
| 72 | + * the {@link java.nio.file.StandardOpenOption#APPEND APPEND} option, in | |
| 73 | + * which case the position is first advanced to the end. The entity to which | |
| 74 | + * the channel is connected is grown, if necessary, to accommodate the | |
| 75 | + * written bytes, and then the position is updated with the number of bytes | |
| 76 | + * actually written. Otherwise this method behaves exactly as specified by | |
| 77 | + * the {@link WritableByteChannel} interface. | |
| 78 | + */ | |
| 79 | + @Override | |
| 80 | + int write(ByteBuffer src) throws IOException; | |
| 81 | + | |
| 82 | + /** | |
| 83 | + * Returns this channel's position. | |
| 84 | + * | |
| 85 | + * @return This channel's position, | |
| 86 | + * a non-negative integer counting the number of bytes | |
| 87 | + * from the beginning of the entity to the current position | |
| 88 | + * | |
| 89 | + * @throws ClosedChannelException | |
| 90 | + * If this channel is closed | |
| 91 | + * @throws IOException | |
| 92 | + * If some other I/O error occurs | |
| 93 | + */ | |
| 94 | + long position() throws IOException; | |
| 95 | + | |
| 96 | + /** | |
| 97 | + * Sets this channel's position. | |
| 98 | + * | |
| 99 | + * <p> Setting the position to a value that is greater than the current size | |
| 100 | + * is legal but does not change the size of the entity. A later attempt to | |
| 101 | + * read bytes at such a position will immediately return an end-of-file | |
| 102 | + * indication. A later attempt to write bytes at such a position will cause | |
| 103 | + * the entity to grow to accommodate the new bytes; the values of any bytes | |
| 104 | + * between the previous end-of-file and the newly-written bytes are | |
| 105 | + * unspecified. | |
| 106 | + * | |
| 107 | + * <p> Setting the channel's position is not recommended when connected to | |
| 108 | + * an entity, typically a file, that is opened with the {@link | |
| 109 | + * java.nio.file.StandardOpenOption#APPEND APPEND} option. When opened for | |
| 110 | + * append, the position is first advanced to the end before writing. | |
| 111 | + * | |
| 112 | + * @param newPosition | |
| 113 | + * The new position, a non-negative integer counting | |
| 114 | + * the number of bytes from the beginning of the entity | |
| 115 | + * | |
| 116 | + * @return This channel | |
| 117 | + * | |
| 118 | + * @throws ClosedChannelException | |
| 119 | + * If this channel is closed | |
| 120 | + * @throws IllegalArgumentException | |
| 121 | + * If the new position is negative | |
| 122 | + * @throws IOException | |
| 123 | + * If some other I/O error occurs | |
| 124 | + */ | |
| 125 | + SeekableByteChannel position(long newPosition) throws IOException; | |
| 126 | + | |
| 127 | + /** | |
| 128 | + * Returns the current size of entity to which this channel is connected. | |
| 129 | + * | |
| 130 | + * @return The current size, measured in bytes | |
| 131 | + * | |
| 132 | + * @throws ClosedChannelException | |
| 133 | + * If this channel is closed | |
| 134 | + * @throws IOException | |
| 135 | + * If some other I/O error occurs | |
| 136 | + */ | |
| 137 | + long size() throws IOException; | |
| 138 | + | |
| 139 | + /** | |
| 140 | + * Truncates the entity, to which this channel is connected, to the given | |
| 141 | + * size. | |
| 142 | + * | |
| 143 | + * <p> If the given size is less than the current size then the entity is | |
| 144 | + * truncated, discarding any bytes beyond the new end. If the given size is | |
| 145 | + * greater than or equal to the current size then the entity is not modified. | |
| 146 | + * In either case, if the current position is greater than the given size | |
| 147 | + * then it is set to that size. | |
| 148 | + * | |
| 149 | + * <p> An implementation of this interface may prohibit truncation when | |
| 150 | + * connected to an entity, typically a file, opened with the {@link | |
| 151 | + * java.nio.file.StandardOpenOption#APPEND APPEND} option. | |
| 152 | + * | |
| 153 | + * @param size | |
| 154 | + * The new size, a non-negative byte count | |
| 155 | + * | |
| 156 | + * @return This channel | |
| 157 | + * | |
| 158 | + * @throws NonWritableChannelException | |
| 159 | + * If this channel was not opened for writing | |
| 160 | + * @throws ClosedChannelException | |
| 161 | + * If this channel is closed | |
| 162 | + * @throws IllegalArgumentException | |
| 163 | + * If the new size is negative | |
| 164 | + * @throws IOException | |
| 165 | + * If some other I/O error occurs | |
| 166 | + */ | |
| 167 | + SeekableByteChannel truncate(long size) throws IOException; | |
| 168 | +} | |
Binary file not shown.
| @@ -0,0 +1,342 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2008, 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.AbstractInterruptibleChannel; | |
| 30 | +import java.nio.channels.spi.SelectorProvider; | |
| 31 | + | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * A channel that can be multiplexed via a {@link Selector}. | |
| 35 | + * | |
| 36 | + * <p> In order to be used with a selector, an instance of this class must | |
| 37 | + * first be <i>registered</i> via the {@link #register(Selector,int,Object) | |
| 38 | + * register} method. This method returns a new {@link SelectionKey} object | |
| 39 | + * that represents the channel's registration with the selector. | |
| 40 | + * | |
| 41 | + * <p> Once registered with a selector, a channel remains registered until it | |
| 42 | + * is <i>deregistered</i>. This involves deallocating whatever resources were | |
| 43 | + * allocated to the channel by the selector. | |
| 44 | + * | |
| 45 | + * <p> A channel cannot be deregistered directly; instead, the key representing | |
| 46 | + * its registration must be <i>cancelled</i>. Cancelling a key requests that | |
| 47 | + * the channel be deregistered during the selector's next selection operation. | |
| 48 | + * A key may be cancelled explicitly by invoking its {@link | |
| 49 | + * SelectionKey#cancel() cancel} method. All of a channel's keys are cancelled | |
| 50 | + * implicitly when the channel is closed, whether by invoking its {@link | |
| 51 | + * Channel#close close} method or by interrupting a thread blocked in an I/O | |
| 52 | + * operation upon the channel. | |
| 53 | + * | |
| 54 | + * <p> If the selector itself is closed then the channel will be deregistered, | |
| 55 | + * and the key representing its registration will be invalidated, without | |
| 56 | + * further delay. | |
| 57 | + * | |
| 58 | + * <p> A channel may be registered at most once with any particular selector. | |
| 59 | + * | |
| 60 | + * <p> Whether or not a channel is registered with one or more selectors may be | |
| 61 | + * determined by invoking the {@link #isRegistered isRegistered} method. | |
| 62 | + * | |
| 63 | + * <p> Selectable channels are safe for use by multiple concurrent | |
| 64 | + * threads. </p> | |
| 65 | + * | |
| 66 | + * | |
| 67 | + * <a name="bm"> | |
| 68 | + * <h4>Blocking mode</h4> | |
| 69 | + * | |
| 70 | + * A selectable channel is either in <i>blocking</i> mode or in | |
| 71 | + * <i>non-blocking</i> mode. In blocking mode, every I/O operation invoked | |
| 72 | + * upon the channel will block until it completes. In non-blocking mode an I/O | |
| 73 | + * operation will never block and may transfer fewer bytes than were requested | |
| 74 | + * or possibly no bytes at all. The blocking mode of a selectable channel may | |
| 75 | + * be determined by invoking its {@link #isBlocking isBlocking} method. | |
| 76 | + * | |
| 77 | + * <p> Newly-created selectable channels are always in blocking mode. | |
| 78 | + * Non-blocking mode is most useful in conjunction with selector-based | |
| 79 | + * multiplexing. A channel must be placed into non-blocking mode before being | |
| 80 | + * registered with a selector, and may not be returned to blocking mode until | |
| 81 | + * it has been deregistered. | |
| 82 | + * | |
| 83 | + * | |
| 84 | + * @author Mark Reinhold | |
| 85 | + * @author JSR-51 Expert Group | |
| 86 | + * @since 1.4 | |
| 87 | + * | |
| 88 | + * @see SelectionKey | |
| 89 | + * @see Selector | |
| 90 | + */ | |
| 91 | + | |
| 92 | +public abstract class SelectableChannel | |
| 93 | + extends AbstractInterruptibleChannel | |
| 94 | + implements Channel | |
| 95 | +{ | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * Initializes a new instance of this class. | |
| 99 | + */ | |
| 100 | + protected SelectableChannel() { } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Returns the provider that created this channel. | |
| 104 | + * | |
| 105 | + * @return The provider that created this channel | |
| 106 | + */ | |
| 107 | + public abstract SelectorProvider provider(); | |
| 108 | + | |
| 109 | + /** | |
| 110 | + * Returns an <a href="SelectionKey.html#opsets">operation set</a> | |
| 111 | + * identifying this channel's supported operations. The bits that are set | |
| 112 | + * in this integer value denote exactly the operations that are valid for | |
| 113 | + * this channel. This method always returns the same value for a given | |
| 114 | + * concrete channel class. </p> | |
| 115 | + * | |
| 116 | + * @return The valid-operation set | |
| 117 | + */ | |
| 118 | + public abstract int validOps(); | |
| 119 | + | |
| 120 | + // Internal state: | |
| 121 | + // keySet, may be empty but is never null, typ. a tiny array | |
| 122 | + // boolean isRegistered, protected by key set | |
| 123 | + // regLock, lock object to prevent duplicate registrations | |
| 124 | + // boolean isBlocking, protected by regLock | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Tells whether or not this channel is currently registered with any | |
| 128 | + * selectors. A newly-created channel is not registered. | |
| 129 | + * | |
| 130 | + * <p> Due to the inherent delay between key cancellation and channel | |
| 131 | + * deregistration, a channel may remain registered for some time after all | |
| 132 | + * of its keys have been cancelled. A channel may also remain registered | |
| 133 | + * for some time after it is closed. </p> | |
| 134 | + * | |
| 135 | + * @return <tt>true</tt> if, and only if, this channel is registered | |
| 136 | + */ | |
| 137 | + public abstract boolean isRegistered(); | |
| 138 | + // | |
| 139 | + // sync(keySet) { return isRegistered; } | |
| 140 | + | |
| 141 | + /** | |
| 142 | + * Retrieves the key representing the channel's registration with the given | |
| 143 | + * selector. </p> | |
| 144 | + * | |
| 145 | + * @return The key returned when this channel was last registered with the | |
| 146 | + * given selector, or <tt>null</tt> if this channel is not | |
| 147 | + * currently registered with that selector | |
| 148 | + */ | |
| 149 | + public abstract SelectionKey keyFor(Selector sel); | |
| 150 | + // | |
| 151 | + // sync(keySet) { return findKey(sel); } | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * Registers this channel with the given selector, returning a selection | |
| 155 | + * key. | |
| 156 | + * | |
| 157 | + * <p> If this channel is currently registered with the given selector then | |
| 158 | + * the selection key representing that registration is returned. The key's | |
| 159 | + * interest set will have been changed to <tt>ops</tt>, as if by invoking | |
| 160 | + * the {@link SelectionKey#interestOps(int) interestOps(int)} method. If | |
| 161 | + * the <tt>att</tt> argument is not <tt>null</tt> then the key's attachment | |
| 162 | + * will have been set to that value. A {@link CancelledKeyException} will | |
| 163 | + * be thrown if the key has already been cancelled. | |
| 164 | + * | |
| 165 | + * <p> Otherwise this channel has not yet been registered with the given | |
| 166 | + * selector, so it is registered and the resulting new key is returned. | |
| 167 | + * The key's initial interest set will be <tt>ops</tt> and its attachment | |
| 168 | + * will be <tt>att</tt>. | |
| 169 | + * | |
| 170 | + * <p> This method may be invoked at any time. If this method is invoked | |
| 171 | + * while another invocation of this method or of the {@link | |
| 172 | + * #configureBlocking(boolean) configureBlocking} method is in progress | |
| 173 | + * then it will first block until the other operation is complete. This | |
| 174 | + * method will then synchronize on the selector's key set and therefore may | |
| 175 | + * block if invoked concurrently with another registration or selection | |
| 176 | + * operation involving the same selector. </p> | |
| 177 | + * | |
| 178 | + * <p> If this channel is closed while this operation is in progress then | |
| 179 | + * the key returned by this method will have been cancelled and will | |
| 180 | + * therefore be invalid. </p> | |
| 181 | + * | |
| 182 | + * @param sel | |
| 183 | + * The selector with which this channel is to be registered | |
| 184 | + * | |
| 185 | + * @param ops | |
| 186 | + * The interest set for the resulting key | |
| 187 | + * | |
| 188 | + * @param att | |
| 189 | + * The attachment for the resulting key; may be <tt>null</tt> | |
| 190 | + * | |
| 191 | + * @throws ClosedChannelException | |
| 192 | + * If this channel is closed | |
| 193 | + * | |
| 194 | + * @throws ClosedSelectorException | |
| 195 | + * If the selector is closed | |
| 196 | + * | |
| 197 | + * @throws IllegalBlockingModeException | |
| 198 | + * If this channel is in blocking mode | |
| 199 | + * | |
| 200 | + * @throws IllegalSelectorException | |
| 201 | + * If this channel was not created by the same provider | |
| 202 | + * as the given selector | |
| 203 | + * | |
| 204 | + * @throws CancelledKeyException | |
| 205 | + * If this channel is currently registered with the given selector | |
| 206 | + * but the corresponding key has already been cancelled | |
| 207 | + * | |
| 208 | + * @throws IllegalArgumentException | |
| 209 | + * If a bit in the <tt>ops</tt> set does not correspond to an | |
| 210 | + * operation that is supported by this channel, that is, if | |
| 211 | + * <tt>set & ~validOps() != 0</tt> | |
| 212 | + * | |
| 213 | + * @return A key representing the registration of this channel with | |
| 214 | + * the given selector | |
| 215 | + */ | |
| 216 | + public abstract SelectionKey register(Selector sel, int ops, Object att) | |
| 217 | + throws ClosedChannelException; | |
| 218 | + // | |
| 219 | + // sync(regLock) { | |
| 220 | + // sync(keySet) { look for selector } | |
| 221 | + // if (channel found) { set interest ops -- may block in selector; | |
| 222 | + // return key; } | |
| 223 | + // create new key -- may block somewhere in selector; | |
| 224 | + // sync(keySet) { add key; } | |
| 225 | + // attach(attachment); | |
| 226 | + // return key; | |
| 227 | + // } | |
| 228 | + | |
| 229 | + /** | |
| 230 | + * Registers this channel with the given selector, returning a selection | |
| 231 | + * key. | |
| 232 | + * | |
| 233 | + * <p> An invocation of this convenience method of the form | |
| 234 | + * | |
| 235 | + * <blockquote><tt>sc.register(sel, ops)</tt></blockquote> | |
| 236 | + * | |
| 237 | + * behaves in exactly the same way as the invocation | |
| 238 | + * | |
| 239 | + * <blockquote><tt>sc.{@link | |
| 240 | + * #register(java.nio.channels.Selector,int,java.lang.Object) | |
| 241 | + * register}(sel, ops, null)</tt></blockquote> | |
| 242 | + * | |
| 243 | + * @param sel | |
| 244 | + * The selector with which this channel is to be registered | |
| 245 | + * | |
| 246 | + * @param ops | |
| 247 | + * The interest set for the resulting key | |
| 248 | + * | |
| 249 | + * @throws ClosedChannelException | |
| 250 | + * If this channel is closed | |
| 251 | + * | |
| 252 | + * @throws ClosedSelectorException | |
| 253 | + * If the selector is closed | |
| 254 | + * | |
| 255 | + * @throws IllegalBlockingModeException | |
| 256 | + * If this channel is in blocking mode | |
| 257 | + * | |
| 258 | + * @throws IllegalSelectorException | |
| 259 | + * If this channel was not created by the same provider | |
| 260 | + * as the given selector | |
| 261 | + * | |
| 262 | + * @throws CancelledKeyException | |
| 263 | + * If this channel is currently registered with the given selector | |
| 264 | + * but the corresponding key has already been cancelled | |
| 265 | + * | |
| 266 | + * @throws IllegalArgumentException | |
| 267 | + * If a bit in <tt>ops</tt> does not correspond to an operation | |
| 268 | + * that is supported by this channel, that is, if <tt>set & | |
| 269 | + * ~validOps() != 0</tt> | |
| 270 | + * | |
| 271 | + * @return A key representing the registration of this channel with | |
| 272 | + * the given selector | |
| 273 | + */ | |
| 274 | + public final SelectionKey register(Selector sel, int ops) | |
| 275 | + throws ClosedChannelException | |
| 276 | + { | |
| 277 | + return register(sel, ops, null); | |
| 278 | + } | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * Adjusts this channel's blocking mode. | |
| 282 | + * | |
| 283 | + * <p> If this channel is registered with one or more selectors then an | |
| 284 | + * attempt to place it into blocking mode will cause an {@link | |
| 285 | + * IllegalBlockingModeException} to be thrown. | |
| 286 | + * | |
| 287 | + * <p> This method may be invoked at any time. The new blocking mode will | |
| 288 | + * only affect I/O operations that are initiated after this method returns. | |
| 289 | + * For some implementations this may require blocking until all pending I/O | |
| 290 | + * operations are complete. | |
| 291 | + * | |
| 292 | + * <p> If this method is invoked while another invocation of this method or | |
| 293 | + * of the {@link #register(Selector, int) register} method is in progress | |
| 294 | + * then it will first block until the other operation is complete. </p> | |
| 295 | + * | |
| 296 | + * @param block If <tt>true</tt> then this channel will be placed in | |
| 297 | + * blocking mode; if <tt>false</tt> then it will be placed | |
| 298 | + * non-blocking mode | |
| 299 | + * | |
| 300 | + * @return This selectable channel | |
| 301 | + * | |
| 302 | + * @throws ClosedChannelException | |
| 303 | + * If this channel is closed | |
| 304 | + * | |
| 305 | + * @throws IllegalBlockingModeException | |
| 306 | + * If <tt>block</tt> is <tt>true</tt> and this channel is | |
| 307 | + * registered with one or more selectors | |
| 308 | + * | |
| 309 | + * @throws IOException | |
| 310 | + * If an I/O error occurs | |
| 311 | + */ | |
| 312 | + public abstract SelectableChannel configureBlocking(boolean block) | |
| 313 | + throws IOException; | |
| 314 | + // | |
| 315 | + // sync(regLock) { | |
| 316 | + // sync(keySet) { throw IBME if block && isRegistered; } | |
| 317 | + // change mode; | |
| 318 | + // } | |
| 319 | + | |
| 320 | + /** | |
| 321 | + * Tells whether or not every I/O operation on this channel will block | |
| 322 | + * until it completes. A newly-created channel is always in blocking mode. | |
| 323 | + * | |
| 324 | + * <p> If this channel is closed then the value returned by this method is | |
| 325 | + * not specified. </p> | |
| 326 | + * | |
| 327 | + * @return <tt>true</tt> if, and only if, this channel is in blocking mode | |
| 328 | + */ | |
| 329 | + public abstract boolean isBlocking(); | |
| 330 | + | |
| 331 | + /** | |
| 332 | + * Retrieves the object upon which the {@link #configureBlocking | |
| 333 | + * configureBlocking} and {@link #register register} methods synchronize. | |
| 334 | + * This is often useful in the implementation of adaptors that require a | |
| 335 | + * specific blocking mode to be maintained for a short period of time. | |
| 336 | + * </p> | |
| 337 | + * | |
| 338 | + * @return The blocking-mode lock object | |
| 339 | + */ | |
| 340 | + public abstract Object blockingLock(); | |
| 341 | + | |
| 342 | +} | |
Binary file not shown.
| @@ -0,0 +1,401 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2008, 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.util.concurrent.atomic.AtomicReferenceFieldUpdater; | |
| 29 | +import java.io.IOException; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A token representing the registration of a {@link SelectableChannel} with a | |
| 34 | + * {@link Selector}. | |
| 35 | + * | |
| 36 | + * <p> A selection key is created each time a channel is registered with a | |
| 37 | + * selector. A key remains valid until it is <i>cancelled</i> by invoking its | |
| 38 | + * {@link #cancel cancel} method, by closing its channel, or by closing its | |
| 39 | + * selector. Cancelling a key does not immediately remove it from its | |
| 40 | + * selector; it is instead added to the selector's <a | |
| 41 | + * href="Selector.html#ks"><i>cancelled-key set</i></a> for removal during the | |
| 42 | + * next selection operation. The validity of a key may be tested by invoking | |
| 43 | + * its {@link #isValid isValid} method. | |
| 44 | + * | |
| 45 | + * <a name="opsets"> | |
| 46 | + * | |
| 47 | + * <p> A selection key contains two <i>operation sets</i> represented as | |
| 48 | + * integer values. Each bit of an operation set denotes a category of | |
| 49 | + * selectable operations that are supported by the key's channel. | |
| 50 | + * | |
| 51 | + * <ul> | |
| 52 | + * | |
| 53 | + * <li><p> The <i>interest set</i> determines which operation categories will | |
| 54 | + * be tested for readiness the next time one of the selector's selection | |
| 55 | + * methods is invoked. The interest set is initialized with the value given | |
| 56 | + * when the key is created; it may later be changed via the {@link | |
| 57 | + * #interestOps(int)} method. </p></li> | |
| 58 | + * | |
| 59 | + * <li><p> The <i>ready set</i> identifies the operation categories for which | |
| 60 | + * the key's channel has been detected to be ready by the key's selector. | |
| 61 | + * The ready set is initialized to zero when the key is created; it may later | |
| 62 | + * be updated by the selector during a selection operation, but it cannot be | |
| 63 | + * updated directly. </p></li> | |
| 64 | + * | |
| 65 | + * </ul> | |
| 66 | + * | |
| 67 | + * <p> That a selection key's ready set indicates that its channel is ready for | |
| 68 | + * some operation category is a hint, but not a guarantee, that an operation in | |
| 69 | + * such a category may be performed by a thread without causing the thread to | |
| 70 | + * block. A ready set is most likely to be accurate immediately after the | |
| 71 | + * completion of a selection operation. It is likely to be made inaccurate by | |
| 72 | + * external events and by I/O operations that are invoked upon the | |
| 73 | + * corresponding channel. | |
| 74 | + * | |
| 75 | + * <p> This class defines all known operation-set bits, but precisely which | |
| 76 | + * bits are supported by a given channel depends upon the type of the channel. | |
| 77 | + * Each subclass of {@link SelectableChannel} defines an {@link | |
| 78 | + * SelectableChannel#validOps() validOps()} method which returns a set | |
| 79 | + * identifying just those operations that are supported by the channel. An | |
| 80 | + * attempt to set or test an operation-set bit that is not supported by a key's | |
| 81 | + * channel will result in an appropriate run-time exception. | |
| 82 | + * | |
| 83 | + * <p> It is often necessary to associate some application-specific data with a | |
| 84 | + * selection key, for example an object that represents the state of a | |
| 85 | + * higher-level protocol and handles readiness notifications in order to | |
| 86 | + * implement that protocol. Selection keys therefore support the | |
| 87 | + * <i>attachment</i> of a single arbitrary object to a key. An object can be | |
| 88 | + * attached via the {@link #attach attach} method and then later retrieved via | |
| 89 | + * the {@link #attachment() attachment} method. | |
| 90 | + * | |
| 91 | + * <p> Selection keys are safe for use by multiple concurrent threads. The | |
| 92 | + * operations of reading and writing the interest set will, in general, be | |
| 93 | + * synchronized with certain operations of the selector. Exactly how this | |
| 94 | + * synchronization is performed is implementation-dependent: In a naive | |
| 95 | + * implementation, reading or writing the interest set may block indefinitely | |
| 96 | + * if a selection operation is already in progress; in a high-performance | |
| 97 | + * implementation, reading or writing the interest set may block briefly, if at | |
| 98 | + * all. In any case, a selection operation will always use the interest-set | |
| 99 | + * value that was current at the moment that the operation began. </p> | |
| 100 | + * | |
| 101 | + * | |
| 102 | + * @author Mark Reinhold | |
| 103 | + * @author JSR-51 Expert Group | |
| 104 | + * @since 1.4 | |
| 105 | + * | |
| 106 | + * @see SelectableChannel | |
| 107 | + * @see Selector | |
| 108 | + */ | |
| 109 | + | |
| 110 | +public abstract class SelectionKey { | |
| 111 | + | |
| 112 | + /** | |
| 113 | + * Constructs an instance of this class. | |
| 114 | + */ | |
| 115 | + protected SelectionKey() { } | |
| 116 | + | |
| 117 | + | |
| 118 | + // -- Channel and selector operations -- | |
| 119 | + | |
| 120 | + /** | |
| 121 | + * Returns the channel for which this key was created. This method will | |
| 122 | + * continue to return the channel even after the key is cancelled. </p> | |
| 123 | + * | |
| 124 | + * @return This key's channel | |
| 125 | + */ | |
| 126 | + public abstract SelectableChannel channel(); | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Returns the selector for which this key was created. This method will | |
| 130 | + * continue to return the selector even after the key is cancelled. </p> | |
| 131 | + * | |
| 132 | + * @return This key's selector | |
| 133 | + */ | |
| 134 | + public abstract Selector selector(); | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Tells whether or not this key is valid. | |
| 138 | + * | |
| 139 | + * <p> A key is valid upon creation and remains so until it is cancelled, | |
| 140 | + * its channel is closed, or its selector is closed. </p> | |
| 141 | + * | |
| 142 | + * @return <tt>true</tt> if, and only if, this key is valid | |
| 143 | + */ | |
| 144 | + public abstract boolean isValid(); | |
| 145 | + | |
| 146 | + /** | |
| 147 | + * Requests that the registration of this key's channel with its selector | |
| 148 | + * be cancelled. Upon return the key will be invalid and will have been | |
| 149 | + * added to its selector's cancelled-key set. The key will be removed from | |
| 150 | + * all of the selector's key sets during the next selection operation. | |
| 151 | + * | |
| 152 | + * <p> If this key has already been cancelled then invoking this method has | |
| 153 | + * no effect. Once cancelled, a key remains forever invalid. </p> | |
| 154 | + * | |
| 155 | + * <p> This method may be invoked at any time. It synchronizes on the | |
| 156 | + * selector's cancelled-key set, and therefore may block briefly if invoked | |
| 157 | + * concurrently with a cancellation or selection operation involving the | |
| 158 | + * same selector. </p> | |
| 159 | + */ | |
| 160 | + public abstract void cancel(); | |
| 161 | + | |
| 162 | + | |
| 163 | + // -- Operation-set accessors -- | |
| 164 | + | |
| 165 | + /** | |
| 166 | + * Retrieves this key's interest set. | |
| 167 | + * | |
| 168 | + * <p> It is guaranteed that the returned set will only contain operation | |
| 169 | + * bits that are valid for this key's channel. | |
| 170 | + * | |
| 171 | + * <p> This method may be invoked at any time. Whether or not it blocks, | |
| 172 | + * and for how long, is implementation-dependent. </p> | |
| 173 | + * | |
| 174 | + * @return This key's interest set | |
| 175 | + * | |
| 176 | + * @throws CancelledKeyException | |
| 177 | + * If this key has been cancelled | |
| 178 | + */ | |
| 179 | + public abstract int interestOps(); | |
| 180 | + | |
| 181 | + /** | |
| 182 | + * Sets this key's interest set to the given value. | |
| 183 | + * | |
| 184 | + * <p> This method may be invoked at any time. Whether or not it blocks, | |
| 185 | + * and for how long, is implementation-dependent. </p> | |
| 186 | + * | |
| 187 | + * @param ops The new interest set | |
| 188 | + * | |
| 189 | + * @return This selection key | |
| 190 | + * | |
| 191 | + * @throws IllegalArgumentException | |
| 192 | + * If a bit in the set does not correspond to an operation that | |
| 193 | + * is supported by this key's channel, that is, if | |
| 194 | + * <tt>(ops & ~channel().validOps()) != 0</tt> | |
| 195 | + * | |
| 196 | + * @throws CancelledKeyException | |
| 197 | + * If this key has been cancelled | |
| 198 | + */ | |
| 199 | + public abstract SelectionKey interestOps(int ops); | |
| 200 | + | |
| 201 | + /** | |
| 202 | + * Retrieves this key's ready-operation set. | |
| 203 | + * | |
| 204 | + * <p> It is guaranteed that the returned set will only contain operation | |
| 205 | + * bits that are valid for this key's channel. </p> | |
| 206 | + * | |
| 207 | + * @return This key's ready-operation set | |
| 208 | + * | |
| 209 | + * @throws CancelledKeyException | |
| 210 | + * If this key has been cancelled | |
| 211 | + */ | |
| 212 | + public abstract int readyOps(); | |
| 213 | + | |
| 214 | + | |
| 215 | + // -- Operation bits and bit-testing convenience methods -- | |
| 216 | + | |
| 217 | + /** | |
| 218 | + * Operation-set bit for read operations. | |
| 219 | + * | |
| 220 | + * <p> Suppose that a selection key's interest set contains | |
| 221 | + * <tt>OP_READ</tt> at the start of a <a | |
| 222 | + * href="Selector.html#selop">selection operation</a>. If the selector | |
| 223 | + * detects that the corresponding channel is ready for reading, has reached | |
| 224 | + * end-of-stream, has been remotely shut down for further reading, or has | |
| 225 | + * an error pending, then it will add <tt>OP_READ</tt> to the key's | |
| 226 | + * ready-operation set and add the key to its selected-key set. </p> | |
| 227 | + */ | |
| 228 | + public static final int OP_READ = 1 << 0; | |
| 229 | + | |
| 230 | + /** | |
| 231 | + * Operation-set bit for write operations. </p> | |
| 232 | + * | |
| 233 | + * <p> Suppose that a selection key's interest set contains | |
| 234 | + * <tt>OP_WRITE</tt> at the start of a <a | |
| 235 | + * href="Selector.html#selop">selection operation</a>. If the selector | |
| 236 | + * detects that the corresponding channel is ready for writing, has been | |
| 237 | + * remotely shut down for further writing, or has an error pending, then it | |
| 238 | + * will add <tt>OP_WRITE</tt> to the key's ready set and add the key to its | |
| 239 | + * selected-key set. </p> | |
| 240 | + */ | |
| 241 | + public static final int OP_WRITE = 1 << 2; | |
| 242 | + | |
| 243 | + /** | |
| 244 | + * Operation-set bit for socket-connect operations. </p> | |
| 245 | + * | |
| 246 | + * <p> Suppose that a selection key's interest set contains | |
| 247 | + * <tt>OP_CONNECT</tt> at the start of a <a | |
| 248 | + * href="Selector.html#selop">selection operation</a>. If the selector | |
| 249 | + * detects that the corresponding socket channel is ready to complete its | |
| 250 | + * connection sequence, or has an error pending, then it will add | |
| 251 | + * <tt>OP_CONNECT</tt> to the key's ready set and add the key to its | |
| 252 | + * selected-key set. </p> | |
| 253 | + */ | |
| 254 | + public static final int OP_CONNECT = 1 << 3; | |
| 255 | + | |
| 256 | + /** | |
| 257 | + * Operation-set bit for socket-accept operations. </p> | |
| 258 | + * | |
| 259 | + * <p> Suppose that a selection key's interest set contains | |
| 260 | + * <tt>OP_ACCEPT</tt> at the start of a <a | |
| 261 | + * href="Selector.html#selop">selection operation</a>. If the selector | |
| 262 | + * detects that the corresponding server-socket channel is ready to accept | |
| 263 | + * another connection, or has an error pending, then it will add | |
| 264 | + * <tt>OP_ACCEPT</tt> to the key's ready set and add the key to its | |
| 265 | + * selected-key set. </p> | |
| 266 | + */ | |
| 267 | + public static final int OP_ACCEPT = 1 << 4; | |
| 268 | + | |
| 269 | + /** | |
| 270 | + * Tests whether this key's channel is ready for reading. | |
| 271 | + * | |
| 272 | + * <p> An invocation of this method of the form <tt>k.isReadable()</tt> | |
| 273 | + * behaves in exactly the same way as the expression | |
| 274 | + * | |
| 275 | + * <blockquote><pre> | |
| 276 | + * k.readyOps() & OP_READ != 0</pre></blockquote> | |
| 277 | + * | |
| 278 | + * <p> If this key's channel does not support read operations then this | |
| 279 | + * method always returns <tt>false</tt>. </p> | |
| 280 | + * | |
| 281 | + * @return <tt>true</tt> if, and only if, | |
| 282 | + * <tt>readyOps()</tt> <tt>&</tt> <tt>OP_READ</tt> is | |
| 283 | + * nonzero | |
| 284 | + * | |
| 285 | + * @throws CancelledKeyException | |
| 286 | + * If this key has been cancelled | |
| 287 | + */ | |
| 288 | + public final boolean isReadable() { | |
| 289 | + return (readyOps() & OP_READ) != 0; | |
| 290 | + } | |
| 291 | + | |
| 292 | + /** | |
| 293 | + * Tests whether this key's channel is ready for writing. | |
| 294 | + * | |
| 295 | + * <p> An invocation of this method of the form <tt>k.isWritable()</tt> | |
| 296 | + * behaves in exactly the same way as the expression | |
| 297 | + * | |
| 298 | + * <blockquote><pre> | |
| 299 | + * k.readyOps() & OP_WRITE != 0</pre></blockquote> | |
| 300 | + * | |
| 301 | + * <p> If this key's channel does not support write operations then this | |
| 302 | + * method always returns <tt>false</tt>. </p> | |
| 303 | + * | |
| 304 | + * @return <tt>true</tt> if, and only if, | |
| 305 | + * <tt>readyOps()</tt> <tt>&</tt> <tt>OP_WRITE</tt> | |
| 306 | + * is nonzero | |
| 307 | + * | |
| 308 | + * @throws CancelledKeyException | |
| 309 | + * If this key has been cancelled | |
| 310 | + */ | |
| 311 | + public final boolean isWritable() { | |
| 312 | + return (readyOps() & OP_WRITE) != 0; | |
| 313 | + } | |
| 314 | + | |
| 315 | + /** | |
| 316 | + * Tests whether this key's channel has either finished, or failed to | |
| 317 | + * finish, its socket-connection operation. | |
| 318 | + * | |
| 319 | + * <p> An invocation of this method of the form <tt>k.isConnectable()</tt> | |
| 320 | + * behaves in exactly the same way as the expression | |
| 321 | + * | |
| 322 | + * <blockquote><pre> | |
| 323 | + * k.readyOps() & OP_CONNECT != 0</pre></blockquote> | |
| 324 | + * | |
| 325 | + * <p> If this key's channel does not support socket-connect operations | |
| 326 | + * then this method always returns <tt>false</tt>. </p> | |
| 327 | + * | |
| 328 | + * @return <tt>true</tt> if, and only if, | |
| 329 | + * <tt>readyOps()</tt> <tt>&</tt> <tt>OP_CONNECT</tt> | |
| 330 | + * is nonzero | |
| 331 | + * | |
| 332 | + * @throws CancelledKeyException | |
| 333 | + * If this key has been cancelled | |
| 334 | + */ | |
| 335 | + public final boolean isConnectable() { | |
| 336 | + return (readyOps() & OP_CONNECT) != 0; | |
| 337 | + } | |
| 338 | + | |
| 339 | + /** | |
| 340 | + * Tests whether this key's channel is ready to accept a new socket | |
| 341 | + * connection. | |
| 342 | + * | |
| 343 | + * <p> An invocation of this method of the form <tt>k.isAcceptable()</tt> | |
| 344 | + * behaves in exactly the same way as the expression | |
| 345 | + * | |
| 346 | + * <blockquote><pre> | |
| 347 | + * k.readyOps() & OP_ACCEPT != 0</pre></blockquote> | |
| 348 | + * | |
| 349 | + * <p> If this key's channel does not support socket-accept operations then | |
| 350 | + * this method always returns <tt>false</tt>. </p> | |
| 351 | + * | |
| 352 | + * @return <tt>true</tt> if, and only if, | |
| 353 | + * <tt>readyOps()</tt> <tt>&</tt> <tt>OP_ACCEPT</tt> | |
| 354 | + * is nonzero | |
| 355 | + * | |
| 356 | + * @throws CancelledKeyException | |
| 357 | + * If this key has been cancelled | |
| 358 | + */ | |
| 359 | + public final boolean isAcceptable() { | |
| 360 | + return (readyOps() & OP_ACCEPT) != 0; | |
| 361 | + } | |
| 362 | + | |
| 363 | + | |
| 364 | + // -- Attachments -- | |
| 365 | + | |
| 366 | + private volatile Object attachment = null; | |
| 367 | + | |
| 368 | + private static final AtomicReferenceFieldUpdater<SelectionKey,Object> | |
| 369 | + attachmentUpdater = AtomicReferenceFieldUpdater.newUpdater( | |
| 370 | + SelectionKey.class, Object.class, "attachment" | |
| 371 | + ); | |
| 372 | + | |
| 373 | + /** | |
| 374 | + * Attaches the given object to this key. | |
| 375 | + * | |
| 376 | + * <p> An attached object may later be retrieved via the {@link #attachment() | |
| 377 | + * attachment} method. Only one object may be attached at a time; invoking | |
| 378 | + * this method causes any previous attachment to be discarded. The current | |
| 379 | + * attachment may be discarded by attaching <tt>null</tt>. </p> | |
| 380 | + * | |
| 381 | + * @param ob | |
| 382 | + * The object to be attached; may be <tt>null</tt> | |
| 383 | + * | |
| 384 | + * @return The previously-attached object, if any, | |
| 385 | + * otherwise <tt>null</tt> | |
| 386 | + */ | |
| 387 | + public final Object attach(Object ob) { | |
| 388 | + return attachmentUpdater.getAndSet(this, ob); | |
| 389 | + } | |
| 390 | + | |
| 391 | + /** | |
| 392 | + * Retrieves the current attachment. </p> | |
| 393 | + * | |
| 394 | + * @return The object currently attached to this key, | |
| 395 | + * or <tt>null</tt> if there is no attachment | |
| 396 | + */ | |
| 397 | + public final Object attachment() { | |
| 398 | + return attachment; | |
| 399 | + } | |
| 400 | + | |
| 401 | +} | |
Binary file not shown.
| @@ -0,0 +1,396 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2004, 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.Closeable; | |
| 29 | +import java.io.IOException; | |
| 30 | +import java.nio.channels.spi.SelectorProvider; | |
| 31 | +import java.util.Set; | |
| 32 | + | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * A multiplexor of {@link SelectableChannel} objects. | |
| 36 | + * | |
| 37 | + * <p> A selector may be created by invoking the {@link #open open} method of | |
| 38 | + * this class, which will use the system's default {@link | |
| 39 | + * java.nio.channels.spi.SelectorProvider </code>selector provider<code>} to | |
| 40 | + * create a new selector. A selector may also be created by invoking the | |
| 41 | + * {@link java.nio.channels.spi.SelectorProvider#openSelector openSelector} | |
| 42 | + * method of a custom selector provider. A selector remains open until it is | |
| 43 | + * closed via its {@link #close close} method. | |
| 44 | + * | |
| 45 | + * <a name="ks"> | |
| 46 | + * | |
| 47 | + * <p> A selectable channel's registration with a selector is represented by a | |
| 48 | + * {@link SelectionKey} object. A selector maintains three sets of selection | |
| 49 | + * keys: | |
| 50 | + * | |
| 51 | + * <ul> | |
| 52 | + * | |
| 53 | + * <li><p> The <i>key set</i> contains the keys representing the current | |
| 54 | + * channel registrations of this selector. This set is returned by the | |
| 55 | + * {@link #keys() keys} method. </p></li> | |
| 56 | + * | |
| 57 | + * <li><p> The <i>selected-key set</i> is the set of keys such that each | |
| 58 | + * key's channel was detected to be ready for at least one of the operations | |
| 59 | + * identified in the key's interest set during a prior selection operation. | |
| 60 | + * This set is returned by the {@link #selectedKeys() selectedKeys} method. | |
| 61 | + * The selected-key set is always a subset of the key set. </p></li> | |
| 62 | + * | |
| 63 | + * <li><p> The <i>cancelled-key</i> set is the set of keys that have been | |
| 64 | + * cancelled but whose channels have not yet been deregistered. This set is | |
| 65 | + * not directly accessible. The cancelled-key set is always a subset of the | |
| 66 | + * key set. </p></li> | |
| 67 | + * | |
| 68 | + * </ul> | |
| 69 | + * | |
| 70 | + * <p> All three sets are empty in a newly-created selector. | |
| 71 | + * | |
| 72 | + * <p> A key is added to a selector's key set as a side effect of registering a | |
| 73 | + * channel via the channel's {@link SelectableChannel#register(Selector,int) | |
| 74 | + * register} method. Cancelled keys are removed from the key set during | |
| 75 | + * selection operations. The key set itself is not directly modifiable. | |
| 76 | + * | |
| 77 | + * <p> A key is added to its selector's cancelled-key set when it is cancelled, | |
| 78 | + * whether by closing its channel or by invoking its {@link SelectionKey#cancel | |
| 79 | + * cancel} method. Cancelling a key will cause its channel to be deregistered | |
| 80 | + * during the next selection operation, at which time the key will removed from | |
| 81 | + * all of the selector's key sets. | |
| 82 | + * | |
| 83 | + * <a name="sks"><p> Keys are added to the selected-key set by selection | |
| 84 | + * operations. A key may be removed directly from the selected-key set by | |
| 85 | + * invoking the set's {@link java.util.Set#remove(java.lang.Object) remove} | |
| 86 | + * method or by invoking the {@link java.util.Iterator#remove() remove} method | |
| 87 | + * of an {@link java.util.Iterator </code>iterator<code>} obtained from the | |
| 88 | + * set. Keys are never removed from the selected-key set in any other way; | |
| 89 | + * they are not, in particular, removed as a side effect of selection | |
| 90 | + * operations. Keys may not be added directly to the selected-key set. </p> | |
| 91 | + * | |
| 92 | + * | |
| 93 | + * <a name="selop"> | |
| 94 | + * <h4>Selection</h4> | |
| 95 | + * | |
| 96 | + * <p> During each selection operation, keys may be added to and removed from a | |
| 97 | + * selector's selected-key set and may be removed from its key and | |
| 98 | + * cancelled-key sets. Selection is performed by the {@link #select()}, {@link | |
| 99 | + * #select(long)}, and {@link #selectNow()} methods, and involves three steps: | |
| 100 | + * </p> | |
| 101 | + * | |
| 102 | + * <ol> | |
| 103 | + * | |
| 104 | + * <li><p> Each key in the cancelled-key set is removed from each key set of | |
| 105 | + * which it is a member, and its channel is deregistered. This step leaves | |
| 106 | + * the cancelled-key set empty. </p></li> | |
| 107 | + * | |
| 108 | + * <li><p> The underlying operating system is queried for an update as to the | |
| 109 | + * readiness of each remaining channel to perform any of the operations | |
| 110 | + * identified by its key's interest set as of the moment that the selection | |
| 111 | + * operation began. For a channel that is ready for at least one such | |
| 112 | + * operation, one of the following two actions is performed: </p> | |
| 113 | + * | |
| 114 | + * <ol type=a> | |
| 115 | + * | |
| 116 | + * <li><p> If the channel's key is not already in the selected-key set then | |
| 117 | + * it is added to that set and its ready-operation set is modified to | |
| 118 | + * identify exactly those operations for which the channel is now reported | |
| 119 | + * to be ready. Any readiness information previously recorded in the ready | |
| 120 | + * set is discarded. </p></li> | |
| 121 | + * | |
| 122 | + * <li><p> Otherwise the channel's key is already in the selected-key set, | |
| 123 | + * so its ready-operation set is modified to identify any new operations | |
| 124 | + * for which the channel is reported to be ready. Any readiness | |
| 125 | + * information previously recorded in the ready set is preserved; in other | |
| 126 | + * words, the ready set returned by the underlying system is | |
| 127 | + * bitwise-disjoined into the key's current ready set. </p></li> | |
| 128 | + * | |
| 129 | + * </ol></li> | |
| 130 | + * | |
| 131 | + * If all of the keys in the key set at the start of this step have empty | |
| 132 | + * interest sets then neither the selected-key set nor any of the keys' | |
| 133 | + * ready-operation sets will be updated. | |
| 134 | + * | |
| 135 | + * <li><p> If any keys were added to the cancelled-key set while step (2) was | |
| 136 | + * in progress then they are processed as in step (1). </p></li> | |
| 137 | + * | |
| 138 | + * </ol> | |
| 139 | + * | |
| 140 | + * <p> Whether or not a selection operation blocks to wait for one or more | |
| 141 | + * channels to become ready, and if so for how long, is the only essential | |
| 142 | + * difference between the three selection methods. </p> | |
| 143 | + * | |
| 144 | + * | |
| 145 | + * <h4>Concurrency</h4> | |
| 146 | + * | |
| 147 | + * <p> Selectors are themselves safe for use by multiple concurrent threads; | |
| 148 | + * their key sets, however, are not. | |
| 149 | + * | |
| 150 | + * <p> The selection operations synchronize on the selector itself, on the key | |
| 151 | + * set, and on the selected-key set, in that order. They also synchronize on | |
| 152 | + * the cancelled-key set during steps (1) and (3) above. | |
| 153 | + * | |
| 154 | + * <p> Changes made to the interest sets of a selector's keys while a | |
| 155 | + * selection operation is in progress have no effect upon that operation; they | |
| 156 | + * will be seen by the next selection operation. | |
| 157 | + * | |
| 158 | + * <p> Keys may be cancelled and channels may be closed at any time. Hence the | |
| 159 | + * presence of a key in one or more of a selector's key sets does not imply | |
| 160 | + * that the key is valid or that its channel is open. Application code should | |
| 161 | + * be careful to synchronize and check these conditions as necessary if there | |
| 162 | + * is any possibility that another thread will cancel a key or close a channel. | |
| 163 | + * | |
| 164 | + * <p> A thread blocked in one of the {@link #select()} or {@link | |
| 165 | + * #select(long)} methods may be interrupted by some other thread in one of | |
| 166 | + * three ways: | |
| 167 | + * | |
| 168 | + * <ul> | |
| 169 | + * | |
| 170 | + * <li><p> By invoking the selector's {@link #wakeup wakeup} method, | |
| 171 | + * </p></li> | |
| 172 | + * | |
| 173 | + * <li><p> By invoking the selector's {@link #close close} method, or | |
| 174 | + * </p></li> | |
| 175 | + * | |
| 176 | + * <li><p> By invoking the blocked thread's {@link | |
| 177 | + * java.lang.Thread#interrupt() interrupt} method, in which case its | |
| 178 | + * interrupt status will be set and the selector's {@link #wakeup wakeup} | |
| 179 | + * method will be invoked. </p></li> | |
| 180 | + * | |
| 181 | + * </ul> | |
| 182 | + * | |
| 183 | + * <p> The {@link #close close} method synchronizes on the selector and all | |
| 184 | + * three key sets in the same order as in a selection operation. | |
| 185 | + * | |
| 186 | + * <a name="ksc"> | |
| 187 | + * | |
| 188 | + * <p> A selector's key and selected-key sets are not, in general, safe for use | |
| 189 | + * by multiple concurrent threads. If such a thread might modify one of these | |
| 190 | + * sets directly then access should be controlled by synchronizing on the set | |
| 191 | + * itself. The iterators returned by these sets' {@link | |
| 192 | + * java.util.Set#iterator() iterator} methods are <i>fail-fast:</i> If the set | |
| 193 | + * is modified after the iterator is created, in any way except by invoking the | |
| 194 | + * iterator's own {@link java.util.Iterator#remove() remove} method, then a | |
| 195 | + * {@link java.util.ConcurrentModificationException} will be thrown. </p> | |
| 196 | + * | |
| 197 | + * | |
| 198 | + * @author Mark Reinhold | |
| 199 | + * @author JSR-51 Expert Group | |
| 200 | + * @since 1.4 | |
| 201 | + * | |
| 202 | + * @see SelectableChannel | |
| 203 | + * @see SelectionKey | |
| 204 | + */ | |
| 205 | + | |
| 206 | +public abstract class Selector implements Closeable { | |
| 207 | + | |
| 208 | + /** | |
| 209 | + * Initializes a new instance of this class. | |
| 210 | + */ | |
| 211 | + protected Selector() { } | |
| 212 | + | |
| 213 | + /** | |
| 214 | + * Opens a selector. | |
| 215 | + * | |
| 216 | + * <p> The new selector is created by invoking the {@link | |
| 217 | + * java.nio.channels.spi.SelectorProvider#openSelector openSelector} method | |
| 218 | + * of the system-wide default {@link | |
| 219 | + * java.nio.channels.spi.SelectorProvider} object. </p> | |
| 220 | + * | |
| 221 | + * @return A new selector | |
| 222 | + * | |
| 223 | + * @throws IOException | |
| 224 | + * If an I/O error occurs | |
| 225 | + */ | |
| 226 | + public static Selector open() throws IOException { | |
| 227 | + return SelectorProvider.provider().openSelector(); | |
| 228 | + } | |
| 229 | + | |
| 230 | + /** | |
| 231 | + * Tells whether or not this selector is open. </p> | |
| 232 | + * | |
| 233 | + * @return <tt>true</tt> if, and only if, this selector is open | |
| 234 | + */ | |
| 235 | + public abstract boolean isOpen(); | |
| 236 | + | |
| 237 | + /** | |
| 238 | + * Returns the provider that created this channel. </p> | |
| 239 | + * | |
| 240 | + * @return The provider that created this channel | |
| 241 | + */ | |
| 242 | + public abstract SelectorProvider provider(); | |
| 243 | + | |
| 244 | + /** | |
| 245 | + * Returns this selector's key set. | |
| 246 | + * | |
| 247 | + * <p> The key set is not directly modifiable. A key is removed only after | |
| 248 | + * it has been cancelled and its channel has been deregistered. Any | |
| 249 | + * attempt to modify the key set will cause an {@link | |
| 250 | + * UnsupportedOperationException} to be thrown. | |
| 251 | + * | |
| 252 | + * <p> The key set is <a href="#ksc">not thread-safe</a>. </p> | |
| 253 | + * | |
| 254 | + * @return This selector's key set | |
| 255 | + * | |
| 256 | + * @throws ClosedSelectorException | |
| 257 | + * If this selector is closed | |
| 258 | + */ | |
| 259 | + public abstract Set<SelectionKey> keys(); | |
| 260 | + | |
| 261 | + /** | |
| 262 | + * Returns this selector's selected-key set. | |
| 263 | + * | |
| 264 | + * <p> Keys may be removed from, but not directly added to, the | |
| 265 | + * selected-key set. Any attempt to add an object to the key set will | |
| 266 | + * cause an {@link UnsupportedOperationException} to be thrown. | |
| 267 | + * | |
| 268 | + * <p> The selected-key set is <a href="#ksc">not thread-safe</a>. </p> | |
| 269 | + * | |
| 270 | + * @return This selector's selected-key set | |
| 271 | + * | |
| 272 | + * @throws ClosedSelectorException | |
| 273 | + * If this selector is closed | |
| 274 | + */ | |
| 275 | + public abstract Set<SelectionKey> selectedKeys(); | |
| 276 | + | |
| 277 | + /** | |
| 278 | + * Selects a set of keys whose corresponding channels are ready for I/O | |
| 279 | + * operations. | |
| 280 | + * | |
| 281 | + * <p> This method performs a non-blocking <a href="#selop">selection | |
| 282 | + * operation</a>. If no channels have become selectable since the previous | |
| 283 | + * selection operation then this method immediately returns zero. | |
| 284 | + * | |
| 285 | + * <p> Invoking this method clears the effect of any previous invocations | |
| 286 | + * of the {@link #wakeup wakeup} method. </p> | |
| 287 | + * | |
| 288 | + * @return The number of keys, possibly zero, whose ready-operation sets | |
| 289 | + * were updated by the selection operation | |
| 290 | + * | |
| 291 | + * @throws IOException | |
| 292 | + * If an I/O error occurs | |
| 293 | + * | |
| 294 | + * @throws ClosedSelectorException | |
| 295 | + * If this selector is closed | |
| 296 | + */ | |
| 297 | + public abstract int selectNow() throws IOException; | |
| 298 | + | |
| 299 | + /** | |
| 300 | + * Selects a set of keys whose corresponding channels are ready for I/O | |
| 301 | + * operations. | |
| 302 | + * | |
| 303 | + * <p> This method performs a blocking <a href="#selop">selection | |
| 304 | + * operation</a>. It returns only after at least one channel is selected, | |
| 305 | + * this selector's {@link #wakeup wakeup} method is invoked, the current | |
| 306 | + * thread is interrupted, or the given timeout period expires, whichever | |
| 307 | + * comes first. | |
| 308 | + * | |
| 309 | + * <p> This method does not offer real-time guarantees: It schedules the | |
| 310 | + * timeout as if by invoking the {@link Object#wait(long)} method. </p> | |
| 311 | + * | |
| 312 | + * @param timeout If positive, block for up to <tt>timeout</tt> | |
| 313 | + * milliseconds, more or less, while waiting for a | |
| 314 | + * channel to become ready; if zero, block indefinitely; | |
| 315 | + * must not be negative | |
| 316 | + * | |
| 317 | + * @return The number of keys, possibly zero, | |
| 318 | + * whose ready-operation sets were updated | |
| 319 | + * | |
| 320 | + * @throws IOException | |
| 321 | + * If an I/O error occurs | |
| 322 | + * | |
| 323 | + * @throws ClosedSelectorException | |
| 324 | + * If this selector is closed | |
| 325 | + * | |
| 326 | + * @throws IllegalArgumentException | |
| 327 | + * If the value of the timeout argument is negative | |
| 328 | + */ | |
| 329 | + public abstract int select(long timeout) | |
| 330 | + throws IOException; | |
| 331 | + | |
| 332 | + /** | |
| 333 | + * Selects a set of keys whose corresponding channels are ready for I/O | |
| 334 | + * operations. | |
| 335 | + * | |
| 336 | + * <p> This method performs a blocking <a href="#selop">selection | |
| 337 | + * operation</a>. It returns only after at least one channel is selected, | |
| 338 | + * this selector's {@link #wakeup wakeup} method is invoked, or the current | |
| 339 | + * thread is interrupted, whichever comes first. </p> | |
| 340 | + * | |
| 341 | + * @return The number of keys, possibly zero, | |
| 342 | + * whose ready-operation sets were updated | |
| 343 | + * | |
| 344 | + * @throws IOException | |
| 345 | + * If an I/O error occurs | |
| 346 | + * | |
| 347 | + * @throws ClosedSelectorException | |
| 348 | + * If this selector is closed | |
| 349 | + */ | |
| 350 | + public abstract int select() throws IOException; | |
| 351 | + | |
| 352 | + /** | |
| 353 | + * Causes the first selection operation that has not yet returned to return | |
| 354 | + * immediately. | |
| 355 | + * | |
| 356 | + * <p> If another thread is currently blocked in an invocation of the | |
| 357 | + * {@link #select()} or {@link #select(long)} methods then that invocation | |
| 358 | + * will return immediately. If no selection operation is currently in | |
| 359 | + * progress then the next invocation of one of these methods will return | |
| 360 | + * immediately unless the {@link #selectNow()} method is invoked in the | |
| 361 | + * meantime. In any case the value returned by that invocation may be | |
| 362 | + * non-zero. Subsequent invocations of the {@link #select()} or {@link | |
| 363 | + * #select(long)} methods will block as usual unless this method is invoked | |
| 364 | + * again in the meantime. | |
| 365 | + * | |
| 366 | + * <p> Invoking this method more than once between two successive selection | |
| 367 | + * operations has the same effect as invoking it just once. </p> | |
| 368 | + * | |
| 369 | + * @return This selector | |
| 370 | + */ | |
| 371 | + public abstract Selector wakeup(); | |
| 372 | + | |
| 373 | + /** | |
| 374 | + * Closes this selector. | |
| 375 | + * | |
| 376 | + * <p> If a thread is currently blocked in one of this selector's selection | |
| 377 | + * methods then it is interrupted as if by invoking the selector's {@link | |
| 378 | + * #wakeup wakeup} method. | |
| 379 | + * | |
| 380 | + * <p> Any uncancelled keys still associated with this selector are | |
| 381 | + * invalidated, their channels are deregistered, and any other resources | |
| 382 | + * associated with this selector are released. | |
| 383 | + * | |
| 384 | + * <p> If this selector is already closed then invoking this method has no | |
| 385 | + * effect. | |
| 386 | + * | |
| 387 | + * <p> After a selector is closed, any further attempt to use it, except by | |
| 388 | + * invoking this method or the {@link #wakeup wakeup} method, will cause a | |
| 389 | + * {@link ClosedSelectorException} to be thrown. </p> | |
| 390 | + * | |
| 391 | + * @throws IOException | |
| 392 | + * If an I/O error occurs | |
| 393 | + */ | |
| 394 | + public abstract void close() throws IOException; | |
| 395 | + | |
| 396 | +} | |
Binary file not shown.
| @@ -0,0 +1,268 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2009, 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.net.ServerSocket; | |
| 30 | +import java.net.SocketOption; | |
| 31 | +import java.net.SocketAddress; | |
| 32 | +import java.nio.channels.spi.AbstractSelectableChannel; | |
| 33 | +import java.nio.channels.spi.SelectorProvider; | |
| 34 | + | |
| 35 | +/** | |
| 36 | + * A selectable channel for stream-oriented listening sockets. | |
| 37 | + * | |
| 38 | + * <p> A server-socket channel is created by invoking the {@link #open() open} | |
| 39 | + * method of this class. It is not possible to create a channel for an arbitrary, | |
| 40 | + * pre-existing {@link ServerSocket}. A newly-created server-socket channel is | |
| 41 | + * open but not yet bound. An attempt to invoke the {@link #accept() accept} | |
| 42 | + * method of an unbound server-socket channel will cause a {@link NotYetBoundException} | |
| 43 | + * to be thrown. A server-socket channel can be bound by invoking one of the | |
| 44 | + * {@link #bind(java.net.SocketAddress,int) bind} methods defined by this class. | |
| 45 | + * | |
| 46 | + * <p> Socket options are configured using the {@link #setOption(SocketOption,Object) | |
| 47 | + * setOption} method. Server-socket channels support the following options: | |
| 48 | + * <blockquote> | |
| 49 | + * <table border> | |
| 50 | + * <tr> | |
| 51 | + * <th>Option Name</th> | |
| 52 | + * <th>Description</th> | |
| 53 | + * </tr> | |
| 54 | + * <tr> | |
| 55 | + * <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td> | |
| 56 | + * <td> The size of the socket receive buffer </td> | |
| 57 | + * </tr> | |
| 58 | + * <tr> | |
| 59 | + * <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td> | |
| 60 | + * <td> Re-use address </td> | |
| 61 | + * </tr> | |
| 62 | + * </table> | |
| 63 | + * </blockquote> | |
| 64 | + * Additional (implementation specific) options may also be supported. | |
| 65 | + * | |
| 66 | + * <p> Server-socket channels are safe for use by multiple concurrent threads. | |
| 67 | + * </p> | |
| 68 | + * | |
| 69 | + * @author Mark Reinhold | |
| 70 | + * @author JSR-51 Expert Group | |
| 71 | + * @since 1.4 | |
| 72 | + */ | |
| 73 | + | |
| 74 | +public abstract class ServerSocketChannel | |
| 75 | + extends AbstractSelectableChannel | |
| 76 | + implements NetworkChannel | |
| 77 | +{ | |
| 78 | + | |
| 79 | + /** | |
| 80 | + * Initializes a new instance of this class. | |
| 81 | + */ | |
| 82 | + protected ServerSocketChannel(SelectorProvider provider) { | |
| 83 | + super(provider); | |
| 84 | + } | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * Opens a server-socket channel. | |
| 88 | + * | |
| 89 | + * <p> The new channel is created by invoking the {@link | |
| 90 | + * java.nio.channels.spi.SelectorProvider#openServerSocketChannel | |
| 91 | + * openServerSocketChannel} method of the system-wide default {@link | |
| 92 | + * java.nio.channels.spi.SelectorProvider} object. | |
| 93 | + * | |
| 94 | + * <p> The new channel's socket is initially unbound; it must be bound to a | |
| 95 | + * specific address via one of its socket's {@link | |
| 96 | + * java.net.ServerSocket#bind(SocketAddress) bind} methods before | |
| 97 | + * connections can be accepted. </p> | |
| 98 | + * | |
| 99 | + * @return A new socket channel | |
| 100 | + * | |
| 101 | + * @throws IOException | |
| 102 | + * If an I/O error occurs | |
| 103 | + */ | |
| 104 | + public static ServerSocketChannel open() throws IOException { | |
| 105 | + return SelectorProvider.provider().openServerSocketChannel(); | |
| 106 | + } | |
| 107 | + | |
| 108 | + /** | |
| 109 | + * Returns an operation set identifying this channel's supported | |
| 110 | + * operations. | |
| 111 | + * | |
| 112 | + * <p> Server-socket channels only support the accepting of new | |
| 113 | + * connections, so this method returns {@link SelectionKey#OP_ACCEPT}. | |
| 114 | + * </p> | |
| 115 | + * | |
| 116 | + * @return The valid-operation set | |
| 117 | + */ | |
| 118 | + public final int validOps() { | |
| 119 | + return SelectionKey.OP_ACCEPT; | |
| 120 | + } | |
| 121 | + | |
| 122 | + | |
| 123 | + // -- ServerSocket-specific operations -- | |
| 124 | + | |
| 125 | + /** | |
| 126 | + * Binds the channel's socket to a local address and configures the socket | |
| 127 | + * to listen for connections. | |
| 128 | + * | |
| 129 | + * <p> An invocation of this method is equivalent to the following: | |
| 130 | + * <blockquote><pre> | |
| 131 | + * bind(local, 0); | |
| 132 | + * </pre></blockquote> | |
| 133 | + * | |
| 134 | + * @param local | |
| 135 | + * The local address to bind the socket, or {@code null} to bind | |
| 136 | + * to an automatically assigned socket address | |
| 137 | + * | |
| 138 | + * @return This channel | |
| 139 | + * | |
| 140 | + * @throws AlreadyBoundException {@inheritDoc} | |
| 141 | + * @throws UnsupportedAddressTypeException {@inheritDoc} | |
| 142 | + * @throws ClosedChannelException {@inheritDoc} | |
| 143 | + * @throws IOException {@inheritDoc} | |
| 144 | + * @throws SecurityException | |
| 145 | + * If a security manager has been installed and its {@link | |
| 146 | + * SecurityManager#checkListen checkListen} method denies the | |
| 147 | + * operation | |
| 148 | + * | |
| 149 | + * @since 1.7 | |
| 150 | + */ | |
| 151 | + public final ServerSocketChannel bind(SocketAddress local) | |
| 152 | + throws IOException | |
| 153 | + { | |
| 154 | + return bind(local, 0); | |
| 155 | + } | |
| 156 | + | |
| 157 | + /** | |
| 158 | + * Binds the channel's socket to a local address and configures the socket to | |
| 159 | + * listen for connections. | |
| 160 | + * | |
| 161 | + * <p> This method is used to establish an association between the socket and | |
| 162 | + * a local address. Once an association is established then the socket remains | |
| 163 | + * bound until the channel is closed. | |
| 164 | + * | |
| 165 | + * <p> The {@code backlog} parameter is the maximum number of pending | |
| 166 | + * connections on the socket. Its exact semantics are implementation specific. | |
| 167 | + * In particular, an implementation may impose a maximum length or may choose | |
| 168 | + * to ignore the parameter altogther. If the {@code backlog} parameter has | |
| 169 | + * the value {@code 0}, or a negative value, then an implementation specific | |
| 170 | + * default is used. | |
| 171 | + * | |
| 172 | + * @param local | |
| 173 | + * The address to bind the socket, or {@code null} to bind to an | |
| 174 | + * automatically assigned socket address | |
| 175 | + * @param backlog | |
| 176 | + * The maximum number of pending connections | |
| 177 | + * | |
| 178 | + * @return This channel | |
| 179 | + * | |
| 180 | + * @throws AlreadyBoundException | |
| 181 | + * If the socket is already bound | |
| 182 | + * @throws UnsupportedAddressTypeException | |
| 183 | + * If the type of the given address is not supported | |
| 184 | + * @throws ClosedChannelException | |
| 185 | + * If this channel is closed | |
| 186 | + * @throws IOException | |
| 187 | + * If some other I/O error occurs | |
| 188 | + * @throws SecurityException | |
| 189 | + * If a security manager has been installed and its {@link | |
| 190 | + * SecurityManager#checkListen checkListen} method denies the | |
| 191 | + * operation | |
| 192 | + * | |
| 193 | + * @since 1.7 | |
| 194 | + */ | |
| 195 | + public abstract ServerSocketChannel bind(SocketAddress local, int backlog) | |
| 196 | + throws IOException; | |
| 197 | + | |
| 198 | + /** | |
| 199 | + * @throws UnsupportedOperationException {@inheritDoc} | |
| 200 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 201 | + * @throws ClosedChannelException {@inheritDoc} | |
| 202 | + * @throws IOException {@inheritDoc} | |
| 203 | + * | |
| 204 | + * @since 1.7 | |
| 205 | + */ | |
| 206 | + public abstract <T> ServerSocketChannel setOption(SocketOption<T> name, T value) | |
| 207 | + throws IOException; | |
| 208 | + | |
| 209 | + /** | |
| 210 | + * Retrieves a server socket associated with this channel. | |
| 211 | + * | |
| 212 | + * <p> The returned object will not declare any public methods that are not | |
| 213 | + * declared in the {@link java.net.ServerSocket} class. </p> | |
| 214 | + * | |
| 215 | + * @return A server socket associated with this channel | |
| 216 | + */ | |
| 217 | + public abstract ServerSocket socket(); | |
| 218 | + | |
| 219 | + /** | |
| 220 | + * Accepts a connection made to this channel's socket. | |
| 221 | + * | |
| 222 | + * <p> If this channel is in non-blocking mode then this method will | |
| 223 | + * immediately return <tt>null</tt> if there are no pending connections. | |
| 224 | + * Otherwise it will block indefinitely until a new connection is available | |
| 225 | + * or an I/O error occurs. | |
| 226 | + * | |
| 227 | + * <p> The socket channel returned by this method, if any, will be in | |
| 228 | + * blocking mode regardless of the blocking mode of this channel. | |
| 229 | + * | |
| 230 | + * <p> This method performs exactly the same security checks as the {@link | |
| 231 | + * java.net.ServerSocket#accept accept} method of the {@link | |
| 232 | + * java.net.ServerSocket} class. That is, if a security manager has been | |
| 233 | + * installed then for each new connection this method verifies that the | |
| 234 | + * address and port number of the connection's remote endpoint are | |
| 235 | + * permitted by the security manager's {@link | |
| 236 | + * java.lang.SecurityManager#checkAccept checkAccept} method. </p> | |
| 237 | + * | |
| 238 | + * @return The socket channel for the new connection, | |
| 239 | + * or <tt>null</tt> if this channel is in non-blocking mode | |
| 240 | + * and no connection is available to be accepted | |
| 241 | + * | |
| 242 | + * @throws ClosedChannelException | |
| 243 | + * If this channel is closed | |
| 244 | + * | |
| 245 | + * @throws AsynchronousCloseException | |
| 246 | + * If another thread closes this channel | |
| 247 | + * while the accept operation is in progress | |
| 248 | + * | |
| 249 | + * @throws ClosedByInterruptException | |
| 250 | + * If another thread interrupts the current thread | |
| 251 | + * while the accept operation is in progress, thereby | |
| 252 | + * closing the channel and setting the current thread's | |
| 253 | + * interrupt status | |
| 254 | + * | |
| 255 | + * @throws NotYetBoundException | |
| 256 | + * If this channel's socket has not yet been bound | |
| 257 | + * | |
| 258 | + * @throws SecurityException | |
| 259 | + * If a security manager has been installed | |
| 260 | + * and it does not permit access to the remote endpoint | |
| 261 | + * of the new connection | |
| 262 | + * | |
| 263 | + * @throws IOException | |
| 264 | + * If some other I/O error occurs | |
| 265 | + */ | |
| 266 | + public abstract SocketChannel accept() throws IOException; | |
| 267 | + | |
| 268 | +} | |
Binary file not shown.
| @@ -0,0 +1,496 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, 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.net.Socket; | |
| 30 | +import java.net.SocketOption; | |
| 31 | +import java.net.SocketAddress; | |
| 32 | +import java.nio.ByteBuffer; | |
| 33 | +import java.nio.channels.spi.AbstractSelectableChannel; | |
| 34 | +import java.nio.channels.spi.SelectorProvider; | |
| 35 | + | |
| 36 | +/** | |
| 37 | + * A selectable channel for stream-oriented connecting sockets. | |
| 38 | + * | |
| 39 | + * <p> A socket channel is created by invoking one of the {@link #open open} | |
| 40 | + * methods of this class. It is not possible to create a channel for an arbitrary, | |
| 41 | + * pre-existing socket. A newly-created socket channel is open but not yet | |
| 42 | + * connected. An attempt to invoke an I/O operation upon an unconnected | |
| 43 | + * channel will cause a {@link NotYetConnectedException} to be thrown. A | |
| 44 | + * socket channel can be connected by invoking its {@link #connect connect} | |
| 45 | + * method; once connected, a socket channel remains connected until it is | |
| 46 | + * closed. Whether or not a socket channel is connected may be determined by | |
| 47 | + * invoking its {@link #isConnected isConnected} method. | |
| 48 | + * | |
| 49 | + * <p> Socket channels support <i>non-blocking connection:</i> A socket | |
| 50 | + * channel may be created and the process of establishing the link to the | |
| 51 | + * remote socket may be initiated via the {@link #connect connect} method for | |
| 52 | + * later completion by the {@link #finishConnect finishConnect} method. | |
| 53 | + * Whether or not a connection operation is in progress may be determined by | |
| 54 | + * invoking the {@link #isConnectionPending isConnectionPending} method. | |
| 55 | + * | |
| 56 | + * <p> Socket channels support <i>asynchronous shutdown,</i> which is similar | |
| 57 | + * to the asynchronous close operation specified in the {@link Channel} class. | |
| 58 | + * If the input side of a socket is shut down by one thread while another | |
| 59 | + * thread is blocked in a read operation on the socket's channel, then the read | |
| 60 | + * operation in the blocked thread will complete without reading any bytes and | |
| 61 | + * will return <tt>-1</tt>. If the output side of a socket is shut down by one | |
| 62 | + * thread while another thread is blocked in a write operation on the socket's | |
| 63 | + * channel, then the blocked thread will receive an {@link | |
| 64 | + * AsynchronousCloseException}. | |
| 65 | + * | |
| 66 | + * <p> Socket options are configured using the {@link #setOption(SocketOption,Object) | |
| 67 | + * setOption} method. Socket channels support the following options: | |
| 68 | + * <blockquote> | |
| 69 | + * <table border> | |
| 70 | + * <tr> | |
| 71 | + * <th>Option Name</th> | |
| 72 | + * <th>Description</th> | |
| 73 | + * </tr> | |
| 74 | + * <tr> | |
| 75 | + * <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td> | |
| 76 | + * <td> The size of the socket send buffer </td> | |
| 77 | + * </tr> | |
| 78 | + * <tr> | |
| 79 | + * <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td> | |
| 80 | + * <td> The size of the socket receive buffer </td> | |
| 81 | + * </tr> | |
| 82 | + * <tr> | |
| 83 | + * <td> {@link java.net.StandardSocketOptions#SO_KEEPALIVE SO_KEEPALIVE} </td> | |
| 84 | + * <td> Keep connection alive </td> | |
| 85 | + * </tr> | |
| 86 | + * <tr> | |
| 87 | + * <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td> | |
| 88 | + * <td> Re-use address </td> | |
| 89 | + * </tr> | |
| 90 | + * <tr> | |
| 91 | + * <td> {@link java.net.StandardSocketOptions#SO_LINGER SO_LINGER} </td> | |
| 92 | + * <td> Linger on close if data is present (when configured in blocking mode | |
| 93 | + * only) </td> | |
| 94 | + * </tr> | |
| 95 | + * <tr> | |
| 96 | + * <td> {@link java.net.StandardSocketOptions#TCP_NODELAY TCP_NODELAY} </td> | |
| 97 | + * <td> Disable the Nagle algorithm </td> | |
| 98 | + * </tr> | |
| 99 | + * </table> | |
| 100 | + * </blockquote> | |
| 101 | + * Additional (implementation specific) options may also be supported. | |
| 102 | + * | |
| 103 | + * <p> Socket channels are safe for use by multiple concurrent threads. They | |
| 104 | + * support concurrent reading and writing, though at most one thread may be | |
| 105 | + * reading and at most one thread may be writing at any given time. The {@link | |
| 106 | + * #connect connect} and {@link #finishConnect finishConnect} methods are | |
| 107 | + * mutually synchronized against each other, and an attempt to initiate a read | |
| 108 | + * or write operation while an invocation of one of these methods is in | |
| 109 | + * progress will block until that invocation is complete. </p> | |
| 110 | + * | |
| 111 | + * @author Mark Reinhold | |
| 112 | + * @author JSR-51 Expert Group | |
| 113 | + * @since 1.4 | |
| 114 | + */ | |
| 115 | + | |
| 116 | +public abstract class SocketChannel | |
| 117 | + extends AbstractSelectableChannel | |
| 118 | + implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel | |
| 119 | +{ | |
| 120 | + | |
| 121 | + /** | |
| 122 | + * Initializes a new instance of this class. | |
| 123 | + */ | |
| 124 | + protected SocketChannel(SelectorProvider provider) { | |
| 125 | + super(provider); | |
| 126 | + } | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Opens a socket channel. | |
| 130 | + * | |
| 131 | + * <p> The new channel is created by invoking the {@link | |
| 132 | + * java.nio.channels.spi.SelectorProvider#openSocketChannel | |
| 133 | + * openSocketChannel} method of the system-wide default {@link | |
| 134 | + * java.nio.channels.spi.SelectorProvider} object. </p> | |
| 135 | + * | |
| 136 | + * @return A new socket channel | |
| 137 | + * | |
| 138 | + * @throws IOException | |
| 139 | + * If an I/O error occurs | |
| 140 | + */ | |
| 141 | + public static SocketChannel open() throws IOException { | |
| 142 | + return SelectorProvider.provider().openSocketChannel(); | |
| 143 | + } | |
| 144 | + | |
| 145 | + /** | |
| 146 | + * Opens a socket channel and connects it to a remote address. | |
| 147 | + * | |
| 148 | + * <p> This convenience method works as if by invoking the {@link #open()} | |
| 149 | + * method, invoking the {@link #connect(SocketAddress) connect} method upon | |
| 150 | + * the resulting socket channel, passing it <tt>remote</tt>, and then | |
| 151 | + * returning that channel. </p> | |
| 152 | + * | |
| 153 | + * @param remote | |
| 154 | + * The remote address to which the new channel is to be connected | |
| 155 | + * | |
| 156 | + * @throws AsynchronousCloseException | |
| 157 | + * If another thread closes this channel | |
| 158 | + * while the connect operation is in progress | |
| 159 | + * | |
| 160 | + * @throws ClosedByInterruptException | |
| 161 | + * If another thread interrupts the current thread | |
| 162 | + * while the connect operation is in progress, thereby | |
| 163 | + * closing the channel and setting the current thread's | |
| 164 | + * interrupt status | |
| 165 | + * | |
| 166 | + * @throws UnresolvedAddressException | |
| 167 | + * If the given remote address is not fully resolved | |
| 168 | + * | |
| 169 | + * @throws UnsupportedAddressTypeException | |
| 170 | + * If the type of the given remote address is not supported | |
| 171 | + * | |
| 172 | + * @throws SecurityException | |
| 173 | + * If a security manager has been installed | |
| 174 | + * and it does not permit access to the given remote endpoint | |
| 175 | + * | |
| 176 | + * @throws IOException | |
| 177 | + * If some other I/O error occurs | |
| 178 | + */ | |
| 179 | + public static SocketChannel open(SocketAddress remote) | |
| 180 | + throws IOException | |
| 181 | + { | |
| 182 | + SocketChannel sc = open(); | |
| 183 | + try { | |
| 184 | + sc.connect(remote); | |
| 185 | + } catch (Throwable x) { | |
| 186 | + try { | |
| 187 | + sc.close(); | |
| 188 | + } catch (Throwable suppressed) { | |
| 189 | + x.addSuppressed(suppressed); | |
| 190 | + } | |
| 191 | + throw x; | |
| 192 | + } | |
| 193 | + assert sc.isConnected(); | |
| 194 | + return sc; | |
| 195 | + } | |
| 196 | + | |
| 197 | + /** | |
| 198 | + * Returns an operation set identifying this channel's supported | |
| 199 | + * operations. | |
| 200 | + * | |
| 201 | + * <p> Socket channels support connecting, reading, and writing, so this | |
| 202 | + * method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT} | |
| 203 | + * <tt>|</tt> {@link SelectionKey#OP_READ} <tt>|</tt> {@link | |
| 204 | + * SelectionKey#OP_WRITE}<tt>)</tt>. </p> | |
| 205 | + * | |
| 206 | + * @return The valid-operation set | |
| 207 | + */ | |
| 208 | + public final int validOps() { | |
| 209 | + return (SelectionKey.OP_READ | |
| 210 | + | SelectionKey.OP_WRITE | |
| 211 | + | SelectionKey.OP_CONNECT); | |
| 212 | + } | |
| 213 | + | |
| 214 | + | |
| 215 | + // -- Socket-specific operations -- | |
| 216 | + | |
| 217 | + /** | |
| 218 | + * @throws ConnectionPendingException | |
| 219 | + * If a non-blocking connect operation is already in progress on | |
| 220 | + * this channel | |
| 221 | + * @throws AlreadyBoundException {@inheritDoc} | |
| 222 | + * @throws UnsupportedAddressTypeException {@inheritDoc} | |
| 223 | + * @throws ClosedChannelException {@inheritDoc} | |
| 224 | + * @throws IOException {@inheritDoc} | |
| 225 | + * | |
| 226 | + * @since 1.7 | |
| 227 | + */ | |
| 228 | + @Override | |
| 229 | + public abstract SocketChannel bind(SocketAddress local) | |
| 230 | + throws IOException; | |
| 231 | + | |
| 232 | + /** | |
| 233 | + * @throws UnsupportedOperationException {@inheritDoc} | |
| 234 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 235 | + * @throws ClosedChannelException {@inheritDoc} | |
| 236 | + * @throws IOException {@inheritDoc} | |
| 237 | + * | |
| 238 | + * @since 1.7 | |
| 239 | + */ | |
| 240 | + @Override | |
| 241 | + public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) | |
| 242 | + throws IOException; | |
| 243 | + | |
| 244 | + /** | |
| 245 | + * Shutdown the connection for reading without closing the channel. | |
| 246 | + * | |
| 247 | + * <p> Once shutdown for reading then further reads on the channel will | |
| 248 | + * return {@code -1}, the end-of-stream indication. If the input side of the | |
| 249 | + * connection is already shutdown then invoking this method has no effect. | |
| 250 | + * | |
| 251 | + * @return The channel | |
| 252 | + * | |
| 253 | + * @throws NotYetConnectedException | |
| 254 | + * If this channel is not yet connected | |
| 255 | + * @throws ClosedChannelException | |
| 256 | + * If this channel is closed | |
| 257 | + * @throws IOException | |
| 258 | + * If some other I/O error occurs | |
| 259 | + * | |
| 260 | + * @since 1.7 | |
| 261 | + */ | |
| 262 | + public abstract SocketChannel shutdownInput() throws IOException; | |
| 263 | + | |
| 264 | + /** | |
| 265 | + * Shutdown the connection for writing without closing the channel. | |
| 266 | + * | |
| 267 | + * <p> Once shutdown for writing then further attempts to write to the | |
| 268 | + * channel will throw {@link ClosedChannelException}. If the output side of | |
| 269 | + * the connection is already shutdown then invoking this method has no | |
| 270 | + * effect. | |
| 271 | + * | |
| 272 | + * @return The channel | |
| 273 | + * | |
| 274 | + * @throws NotYetConnectedException | |
| 275 | + * If this channel is not yet connected | |
| 276 | + * @throws ClosedChannelException | |
| 277 | + * If this channel is closed | |
| 278 | + * @throws IOException | |
| 279 | + * If some other I/O error occurs | |
| 280 | + * | |
| 281 | + * @since 1.7 | |
| 282 | + */ | |
| 283 | + public abstract SocketChannel shutdownOutput() throws IOException; | |
| 284 | + | |
| 285 | + /** | |
| 286 | + * Retrieves a socket associated with this channel. | |
| 287 | + * | |
| 288 | + * <p> The returned object will not declare any public methods that are not | |
| 289 | + * declared in the {@link java.net.Socket} class. </p> | |
| 290 | + * | |
| 291 | + * @return A socket associated with this channel | |
| 292 | + */ | |
| 293 | + public abstract Socket socket(); | |
| 294 | + | |
| 295 | + /** | |
| 296 | + * Tells whether or not this channel's network socket is connected. | |
| 297 | + * | |
| 298 | + * @return <tt>true</tt> if, and only if, this channel's network socket | |
| 299 | + * is {@link #isOpen open} and connected | |
| 300 | + */ | |
| 301 | + public abstract boolean isConnected(); | |
| 302 | + | |
| 303 | + /** | |
| 304 | + * Tells whether or not a connection operation is in progress on this | |
| 305 | + * channel. </p> | |
| 306 | + * | |
| 307 | + * @return <tt>true</tt> if, and only if, a connection operation has been | |
| 308 | + * initiated on this channel but not yet completed by invoking the | |
| 309 | + * {@link #finishConnect finishConnect} method | |
| 310 | + */ | |
| 311 | + public abstract boolean isConnectionPending(); | |
| 312 | + | |
| 313 | + /** | |
| 314 | + * Connects this channel's socket. | |
| 315 | + * | |
| 316 | + * <p> If this channel is in non-blocking mode then an invocation of this | |
| 317 | + * method initiates a non-blocking connection operation. If the connection | |
| 318 | + * is established immediately, as can happen with a local connection, then | |
| 319 | + * this method returns <tt>true</tt>. Otherwise this method returns | |
| 320 | + * <tt>false</tt> and the connection operation must later be completed by | |
| 321 | + * invoking the {@link #finishConnect finishConnect} method. | |
| 322 | + * | |
| 323 | + * <p> If this channel is in blocking mode then an invocation of this | |
| 324 | + * method will block until the connection is established or an I/O error | |
| 325 | + * occurs. | |
| 326 | + * | |
| 327 | + * <p> This method performs exactly the same security checks as the {@link | |
| 328 | + * java.net.Socket} class. That is, if a security manager has been | |
| 329 | + * installed then this method verifies that its {@link | |
| 330 | + * java.lang.SecurityManager#checkConnect checkConnect} method permits | |
| 331 | + * connecting to the address and port number of the given remote endpoint. | |
| 332 | + * | |
| 333 | + * <p> This method may be invoked at any time. If a read or write | |
| 334 | + * operation upon this channel is invoked while an invocation of this | |
| 335 | + * method is in progress then that operation will first block until this | |
| 336 | + * invocation is complete. If a connection attempt is initiated but fails, | |
| 337 | + * that is, if an invocation of this method throws a checked exception, | |
| 338 | + * then the channel will be closed. </p> | |
| 339 | + * | |
| 340 | + * @param remote | |
| 341 | + * The remote address to which this channel is to be connected | |
| 342 | + * | |
| 343 | + * @return <tt>true</tt> if a connection was established, | |
| 344 | + * <tt>false</tt> if this channel is in non-blocking mode | |
| 345 | + * and the connection operation is in progress | |
| 346 | + * | |
| 347 | + * @throws AlreadyConnectedException | |
| 348 | + * If this channel is already connected | |
| 349 | + * | |
| 350 | + * @throws ConnectionPendingException | |
| 351 | + * If a non-blocking connection operation is already in progress | |
| 352 | + * on this channel | |
| 353 | + * | |
| 354 | + * @throws ClosedChannelException | |
| 355 | + * If this channel is closed | |
| 356 | + * | |
| 357 | + * @throws AsynchronousCloseException | |
| 358 | + * If another thread closes this channel | |
| 359 | + * while the connect operation is in progress | |
| 360 | + * | |
| 361 | + * @throws ClosedByInterruptException | |
| 362 | + * If another thread interrupts the current thread | |
| 363 | + * while the connect operation is in progress, thereby | |
| 364 | + * closing the channel and setting the current thread's | |
| 365 | + * interrupt status | |
| 366 | + * | |
| 367 | + * @throws UnresolvedAddressException | |
| 368 | + * If the given remote address is not fully resolved | |
| 369 | + * | |
| 370 | + * @throws UnsupportedAddressTypeException | |
| 371 | + * If the type of the given remote address is not supported | |
| 372 | + * | |
| 373 | + * @throws SecurityException | |
| 374 | + * If a security manager has been installed | |
| 375 | + * and it does not permit access to the given remote endpoint | |
| 376 | + * | |
| 377 | + * @throws IOException | |
| 378 | + * If some other I/O error occurs | |
| 379 | + */ | |
| 380 | + public abstract boolean connect(SocketAddress remote) throws IOException; | |
| 381 | + | |
| 382 | + /** | |
| 383 | + * Finishes the process of connecting a socket channel. | |
| 384 | + * | |
| 385 | + * <p> A non-blocking connection operation is initiated by placing a socket | |
| 386 | + * channel in non-blocking mode and then invoking its {@link #connect | |
| 387 | + * connect} method. Once the connection is established, or the attempt has | |
| 388 | + * failed, the socket channel will become connectable and this method may | |
| 389 | + * be invoked to complete the connection sequence. If the connection | |
| 390 | + * operation failed then invoking this method will cause an appropriate | |
| 391 | + * {@link java.io.IOException} to be thrown. | |
| 392 | + * | |
| 393 | + * <p> If this channel is already connected then this method will not block | |
| 394 | + * and will immediately return <tt>true</tt>. If this channel is in | |
| 395 | + * non-blocking mode then this method will return <tt>false</tt> if the | |
| 396 | + * connection process is not yet complete. If this channel is in blocking | |
| 397 | + * mode then this method will block until the connection either completes | |
| 398 | + * or fails, and will always either return <tt>true</tt> or throw a checked | |
| 399 | + * exception describing the failure. | |
| 400 | + * | |
| 401 | + * <p> This method may be invoked at any time. If a read or write | |
| 402 | + * operation upon this channel is invoked while an invocation of this | |
| 403 | + * method is in progress then that operation will first block until this | |
| 404 | + * invocation is complete. If a connection attempt fails, that is, if an | |
| 405 | + * invocation of this method throws a checked exception, then the channel | |
| 406 | + * will be closed. </p> | |
| 407 | + * | |
| 408 | + * @return <tt>true</tt> if, and only if, this channel's socket is now | |
| 409 | + * connected | |
| 410 | + * | |
| 411 | + * @throws NoConnectionPendingException | |
| 412 | + * If this channel is not connected and a connection operation | |
| 413 | + * has not been initiated | |
| 414 | + * | |
| 415 | + * @throws ClosedChannelException | |
| 416 | + * If this channel is closed | |
| 417 | + * | |
| 418 | + * @throws AsynchronousCloseException | |
| 419 | + * If another thread closes this channel | |
| 420 | + * while the connect operation is in progress | |
| 421 | + * | |
| 422 | + * @throws ClosedByInterruptException | |
| 423 | + * If another thread interrupts the current thread | |
| 424 | + * while the connect operation is in progress, thereby | |
| 425 | + * closing the channel and setting the current thread's | |
| 426 | + * interrupt status | |
| 427 | + * | |
| 428 | + * @throws IOException | |
| 429 | + * If some other I/O error occurs | |
| 430 | + */ | |
| 431 | + public abstract boolean finishConnect() throws IOException; | |
| 432 | + | |
| 433 | + /** | |
| 434 | + * Returns the remote address to which this channel's socket is connected. | |
| 435 | + * | |
| 436 | + * <p> Where the channel is bound and connected to an Internet Protocol | |
| 437 | + * socket address then the return value from this method is of type {@link | |
| 438 | + * java.net.InetSocketAddress}. | |
| 439 | + * | |
| 440 | + * @return The remote address; {@code null} if the channel's socket is not | |
| 441 | + * connected | |
| 442 | + * | |
| 443 | + * @throws ClosedChannelException | |
| 444 | + * If the channel is closed | |
| 445 | + * @throws IOException | |
| 446 | + * If an I/O error occurs | |
| 447 | + * | |
| 448 | + * @since 1.7 | |
| 449 | + */ | |
| 450 | + public abstract SocketAddress getRemoteAddress() throws IOException; | |
| 451 | + | |
| 452 | + // -- ByteChannel operations -- | |
| 453 | + | |
| 454 | + /** | |
| 455 | + * @throws NotYetConnectedException | |
| 456 | + * If this channel is not yet connected | |
| 457 | + */ | |
| 458 | + public abstract int read(ByteBuffer dst) throws IOException; | |
| 459 | + | |
| 460 | + /** | |
| 461 | + * @throws NotYetConnectedException | |
| 462 | + * If this channel is not yet connected | |
| 463 | + */ | |
| 464 | + public abstract long read(ByteBuffer[] dsts, int offset, int length) | |
| 465 | + throws IOException; | |
| 466 | + | |
| 467 | + /** | |
| 468 | + * @throws NotYetConnectedException | |
| 469 | + * If this channel is not yet connected | |
| 470 | + */ | |
| 471 | + public final long read(ByteBuffer[] dsts) throws IOException { | |
| 472 | + return read(dsts, 0, dsts.length); | |
| 473 | + } | |
| 474 | + | |
| 475 | + /** | |
| 476 | + * @throws NotYetConnectedException | |
| 477 | + * If this channel is not yet connected | |
| 478 | + */ | |
| 479 | + public abstract int write(ByteBuffer src) throws IOException; | |
| 480 | + | |
| 481 | + /** | |
| 482 | + * @throws NotYetConnectedException | |
| 483 | + * If this channel is not yet connected | |
| 484 | + */ | |
| 485 | + public abstract long write(ByteBuffer[] srcs, int offset, int length) | |
| 486 | + throws IOException; | |
| 487 | + | |
| 488 | + /** | |
| 489 | + * @throws NotYetConnectedException | |
| 490 | + * If this channel is not yet connected | |
| 491 | + */ | |
| 492 | + public final long write(ByteBuffer[] srcs) throws IOException { | |
| 493 | + return write(srcs, 0, srcs.length); | |
| 494 | + } | |
| 495 | + | |
| 496 | +} | |
Binary file not shown.
| @@ -0,0 +1,105 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2005, 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.ByteBuffer; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * A channel that can write bytes. | |
| 34 | + * | |
| 35 | + * <p> Only one write operation upon a writable channel may be in progress at | |
| 36 | + * any given time. If one thread initiates a write operation upon a channel | |
| 37 | + * then any other thread that attempts to initiate another write operation will | |
| 38 | + * block until the first operation is complete. Whether or not other kinds of | |
| 39 | + * I/O operations may proceed concurrently with a write operation depends upon | |
| 40 | + * the type of the channel. </p> | |
| 41 | + * | |
| 42 | + * | |
| 43 | + * @author Mark Reinhold | |
| 44 | + * @author JSR-51 Expert Group | |
| 45 | + * @since 1.4 | |
| 46 | + */ | |
| 47 | + | |
| 48 | +public interface WritableByteChannel | |
| 49 | + extends Channel | |
| 50 | +{ | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Writes a sequence of bytes to this channel from the given buffer. | |
| 54 | + * | |
| 55 | + * <p> An attempt is made to write up to <i>r</i> bytes to the channel, | |
| 56 | + * where <i>r</i> is the number of bytes remaining in the buffer, that is, | |
| 57 | + * <tt>src.remaining()</tt>, at the moment this method is invoked. | |
| 58 | + * | |
| 59 | + * <p> Suppose that a byte sequence of length <i>n</i> is written, where | |
| 60 | + * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. | |
| 61 | + * This byte sequence will be transferred from the buffer starting at index | |
| 62 | + * <i>p</i>, where <i>p</i> is the buffer's position at the moment this | |
| 63 | + * method is invoked; the index of the last byte written will be | |
| 64 | + * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>. | |
| 65 | + * Upon return the buffer's position will be equal to | |
| 66 | + * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. | |
| 67 | + * | |
| 68 | + * <p> Unless otherwise specified, a write operation will return only after | |
| 69 | + * writing all of the <i>r</i> requested bytes. Some types of channels, | |
| 70 | + * depending upon their state, may write only some of the bytes or possibly | |
| 71 | + * none at all. A socket channel in non-blocking mode, for example, cannot | |
| 72 | + * write any more bytes than are free in the socket's output buffer. | |
| 73 | + * | |
| 74 | + * <p> This method may be invoked at any time. If another thread has | |
| 75 | + * already initiated a write operation upon this channel, however, then an | |
| 76 | + * invocation of this method will block until the first operation is | |
| 77 | + * complete. </p> | |
| 78 | + * | |
| 79 | + * @param src | |
| 80 | + * The buffer from which bytes are to be retrieved | |
| 81 | + * | |
| 82 | + * @return The number of bytes written, possibly zero | |
| 83 | + * | |
| 84 | + * @throws NonWritableChannelException | |
| 85 | + * If this channel was not opened for writing | |
| 86 | + * | |
| 87 | + * @throws ClosedChannelException | |
| 88 | + * If this channel is closed | |
| 89 | + * | |
| 90 | + * @throws AsynchronousCloseException | |
| 91 | + * If another thread closes this channel | |
| 92 | + * while the write operation is in progress | |
| 93 | + * | |
| 94 | + * @throws ClosedByInterruptException | |
| 95 | + * If another thread interrupts the current thread | |
| 96 | + * while the write operation is in progress, thereby | |
| 97 | + * closing the channel and setting the current thread's | |
| 98 | + * interrupt status | |
| 99 | + * | |
| 100 | + * @throws IOException | |
| 101 | + * If some other I/O error occurs | |
| 102 | + */ | |
| 103 | + public int write(ByteBuffer src) throws IOException; | |
| 104 | + | |
| 105 | +} | |
| @@ -0,0 +1,194 @@ | ||
| 1 | +# | |
| 2 | +# Copyright (c) 2000, 2009, 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 | +# Generated exception classes for java.nio.channels | |
| 27 | + | |
| 28 | +SINCE=1.4 | |
| 29 | +PACKAGE=java.nio.channels | |
| 30 | +# This year should only change if the generated source is modified. | |
| 31 | +COPYRIGHT_YEARS="2000, 2007," | |
| 32 | + | |
| 33 | + | |
| 34 | +SUPER=java.io.IOException | |
| 35 | + | |
| 36 | +gen ClosedChannelException " | |
| 37 | + * Checked exception thrown when an attempt is made to invoke or complete an | |
| 38 | + * I/O operation upon channel that is closed, or at least closed to that | |
| 39 | + * operation. That this exception is thrown does not necessarily imply that | |
| 40 | + * the channel is completely closed. A socket channel whose write half has | |
| 41 | + * been shut down, for example, may still be open for reading." \ | |
| 42 | + 882777185433553857L | |
| 43 | + | |
| 44 | +gen FileLockInterruptionException " | |
| 45 | + * Checked exception received by a thread when another thread interrupts it | |
| 46 | + * while it is waiting to acquire a file lock. Before this exception is thrown | |
| 47 | + * the interrupt status of the previously-blocked thread will have been set." \ | |
| 48 | + 7104080643653532383L | |
| 49 | + | |
| 50 | + | |
| 51 | +SUPER=ClosedChannelException | |
| 52 | + | |
| 53 | +gen AsynchronousCloseException " | |
| 54 | + * Checked exception received by a thread when another thread closes the | |
| 55 | + * channel or the part of the channel upon which it is blocked in an I/O | |
| 56 | + * operation." \ | |
| 57 | + 6891178312432313966L | |
| 58 | + | |
| 59 | + | |
| 60 | +SUPER=AsynchronousCloseException | |
| 61 | + | |
| 62 | +gen ClosedByInterruptException " | |
| 63 | + * Checked exception received by a thread when another thread interrupts it | |
| 64 | + * while it is blocked in an I/O operation upon a channel. Before this | |
| 65 | + * exception is thrown the channel will have been closed and the interrupt | |
| 66 | + * status of the previously-blocked thread will have been set." \ | |
| 67 | + -4488191543534286750L | |
| 68 | + | |
| 69 | + | |
| 70 | +SUPER=IllegalArgumentException | |
| 71 | + | |
| 72 | +gen IllegalSelectorException " | |
| 73 | + * Unchecked exception thrown when an attempt is made to register a channel | |
| 74 | + * with a selector that was not created by the provider that created the | |
| 75 | + * channel." \ | |
| 76 | + -8406323347253320987L | |
| 77 | + | |
| 78 | +gen UnresolvedAddressException " | |
| 79 | + * Unchecked exception thrown when an attempt is made to invoke a network | |
| 80 | + * operation upon an unresolved socket address." \ | |
| 81 | + 6136959093620794148L | |
| 82 | + | |
| 83 | +gen UnsupportedAddressTypeException " | |
| 84 | + * Unchecked exception thrown when an attempt is made to bind or connect | |
| 85 | + * to a socket address of a type that is not supported." \ | |
| 86 | + -2964323842829700493L | |
| 87 | + | |
| 88 | + | |
| 89 | +SUPER=IllegalStateException | |
| 90 | + | |
| 91 | +gen AlreadyConnectedException " | |
| 92 | + * Unchecked exception thrown when an attempt is made to connect a {@link | |
| 93 | + * SocketChannel} that is already connected." \ | |
| 94 | + -7331895245053773357L | |
| 95 | + | |
| 96 | +gen ConnectionPendingException " | |
| 97 | + * Unchecked exception thrown when an attempt is made to connect a {@link | |
| 98 | + * SocketChannel} for which a non-blocking connection operation is already in | |
| 99 | + * progress." \ | |
| 100 | + 2008393366501760879L | |
| 101 | + | |
| 102 | +gen ClosedSelectorException " | |
| 103 | + * Unchecked exception thrown when an attempt is made to invoke an I/O | |
| 104 | + * operation upon a closed selector." \ | |
| 105 | + 6466297122317847835L | |
| 106 | + | |
| 107 | +gen CancelledKeyException " | |
| 108 | + * Unchecked exception thrown when an attempt is made to use | |
| 109 | + * a selection key that is no longer valid." \ | |
| 110 | + -8438032138028814268L | |
| 111 | + | |
| 112 | +gen IllegalBlockingModeException " | |
| 113 | + * Unchecked exception thrown when a blocking-mode-specific operation | |
| 114 | + * is invoked upon a channel in the incorrect blocking mode." \ | |
| 115 | + -3335774961855590474L | |
| 116 | + | |
| 117 | +gen NoConnectionPendingException " | |
| 118 | + * Unchecked exception thrown when the {@link SocketChannel#finishConnect | |
| 119 | + * finishConnect} method of a {@link SocketChannel} is invoked without first | |
| 120 | + * successfully invoking its {@link SocketChannel#connect connect} method." \ | |
| 121 | + -8296561183633134743L | |
| 122 | + | |
| 123 | +gen NonReadableChannelException " | |
| 124 | + * Unchecked exception thrown when an attempt is made to read | |
| 125 | + * from a channel that was not originally opened for reading." \ | |
| 126 | + -3200915679294993514L | |
| 127 | + | |
| 128 | +gen NonWritableChannelException " | |
| 129 | + * Unchecked exception thrown when an attempt is made to write | |
| 130 | + * to a channel that was not originally opened for writing." \ | |
| 131 | + -7071230488279011621L | |
| 132 | + | |
| 133 | +gen NotYetBoundException " | |
| 134 | + * Unchecked exception thrown when an attempt is made to invoke an I/O | |
| 135 | + * operation upon a server socket channel that is not yet bound." \ | |
| 136 | + 4640999303950202242L | |
| 137 | + | |
| 138 | +gen NotYetConnectedException " | |
| 139 | + * Unchecked exception thrown when an attempt is made to invoke an I/O | |
| 140 | + * operation upon a socket channel that is not yet connected." \ | |
| 141 | + 4697316551909513464L | |
| 142 | + | |
| 143 | +gen OverlappingFileLockException " | |
| 144 | + * Unchecked exception thrown when an attempt is made to acquire a lock on a | |
| 145 | + * region of a file that overlaps a region already locked by the same Java | |
| 146 | + * virtual machine, or when another thread is already waiting to lock an | |
| 147 | + * overlapping region of the same file." \ | |
| 148 | + 2047812138163068433L | |
| 149 | + | |
| 150 | + | |
| 151 | +SINCE=1.7 | |
| 152 | + | |
| 153 | +SUPER=java.io.IOException | |
| 154 | + | |
| 155 | +gen InterruptedByTimeoutException " | |
| 156 | + * Checked exception received by a thread when a timeout elapses before an | |
| 157 | + * asynchronous operation completes." \ | |
| 158 | + -4268008601014042947L | |
| 159 | + | |
| 160 | +SUPER=IllegalArgumentException | |
| 161 | + | |
| 162 | +gen IllegalChannelGroupException " | |
| 163 | + * Unchecked exception thrown when an attempt is made to open a channel | |
| 164 | + * in a group that was not created by the same provider. " \ | |
| 165 | + -2495041211157744253L | |
| 166 | + | |
| 167 | + | |
| 168 | +SUPER=IllegalStateException | |
| 169 | + | |
| 170 | +gen AlreadyBoundException " | |
| 171 | + * Unchecked exception thrown when an attempt is made to bind the socket a | |
| 172 | + * network oriented channel that is already bound." \ | |
| 173 | + 6796072983322737592L | |
| 174 | + | |
| 175 | +gen AcceptPendingException " | |
| 176 | + * Unchecked exception thrown when an attempt is made to initiate an accept | |
| 177 | + * operation on a channel and a previous accept operation has not completed." \ | |
| 178 | + 2721339977965416421L | |
| 179 | + | |
| 180 | +gen ReadPendingException " | |
| 181 | + * Unchecked exception thrown when an attempt is made to read from an | |
| 182 | + * asynchronous socket channel and a previous read has not completed." \ | |
| 183 | + 1986315242191227217L | |
| 184 | + | |
| 185 | +gen WritePendingException " | |
| 186 | + * Unchecked exception thrown when an attempt is made to write to an | |
| 187 | + * asynchronous socket channel and a previous write has not completed." \ | |
| 188 | + 7031871839266032276L | |
| 189 | + | |
| 190 | +gen ShutdownChannelGroupException " | |
| 191 | + * Unchecked exception thrown when an attempt is made to construct a channel in | |
| 192 | + * a group that is shutdown or the completion handler for an I/O operation | |
| 193 | + * cannot be invoked because the channel group has terminated." \ | |
| 194 | + -3903801676350154157L | |
| @@ -0,0 +1,40 @@ | ||
| 1 | +<../../../../../mkconfig | |
| 2 | + | |
| 3 | +DIRS=\ | |
| 4 | + spi\ | |
| 5 | + | |
| 6 | +TARG=\ | |
| 7 | + AsynchronousByteChannel.dis\ | |
| 8 | + AsynchronousChannel.dis\ | |
| 9 | + AsynchronousChannelGroup.dis\ | |
| 10 | + AsynchronousFileChannel.dis\ | |
| 11 | + AsynchronousServerSocketChannel.dis\ | |
| 12 | + AsynchronousSocketChannel.dis\ | |
| 13 | + ByteChannel.dis\ | |
| 14 | + Channel.dis\ | |
| 15 | + Channels.dis\ | |
| 16 | + CompletionHandler.dis\ | |
| 17 | + DatagramChannel.dis\ | |
| 18 | + FileChannel.dis\ | |
| 19 | + FileLock.dis\ | |
| 20 | + GatheringByteChannel.dis\ | |
| 21 | + InterruptibleChannel.dis\ | |
| 22 | + MembershipKey.dis\ | |
| 23 | + MulticastChannel.dis\ | |
| 24 | + NetworkChannel.dis\ | |
| 25 | + package-info.dis\ | |
| 26 | + Pipe.dis\ | |
| 27 | + ReadableByteChannel.dis\ | |
| 28 | + ScatteringByteChannel.dis\ | |
| 29 | + SeekableByteChannel.dis\ | |
| 30 | + SelectableChannel.dis\ | |
| 31 | + SelectionKey.dis\ | |
| 32 | + Selector.dis\ | |
| 33 | + ServerSocketChannel.dis\ | |
| 34 | + SocketChannel.dis\ | |
| 35 | + WritableByteChannel.dis\ | |
| 36 | + | |
| 37 | +DISBIN=$ROOT/java/dis/java/java/java/nio/channels | |
| 38 | + | |
| 39 | +<$ROOT/mkfiles/mkjava | |
| 40 | +<$ROOT/mkfiles/mksubdirs | |
| @@ -0,0 +1,290 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2001, 2010, 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 | +/** | |
| 27 | + * Defines channels, which represent connections to entities that are capable of | |
| 28 | + * performing I/O operations, such as files and sockets; defines selectors, for | |
| 29 | + * multiplexed, non-blocking I/O operations. | |
| 30 | + * | |
| 31 | + * <a name="channels"></a> | |
| 32 | + * | |
| 33 | + * <blockquote><table cellspacing=1 cellpadding=0 summary="Lists channels and their descriptions"> | |
| 34 | + * <tr><th><p align="left">Channels</p></th><th><p align="left">Description</p></th></tr> | |
| 35 | + * <tr><td valign=top><tt><i>{@link java.nio.channels.Channel}</i></tt></td> | |
| 36 | + * <td>A nexus for I/O operations</td></tr> | |
| 37 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.ReadableByteChannel}</i></tt></td> | |
| 38 | + * <td>Can read into a buffer</td></tr> | |
| 39 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.ScatteringByteChannel} </i></tt></td> | |
| 40 | + * <td>Can read into a sequence of buffers</td></tr> | |
| 41 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.WritableByteChannel}</i></tt></td> | |
| 42 | + * <td>Can write from a buffer</td></tr> | |
| 43 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.GatheringByteChannel}</i></tt></td> | |
| 44 | + * <td>Can write from a sequence of buffers</td></tr> | |
| 45 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.ByteChannel}</i></tt></td> | |
| 46 | + * <td>Can read/write to/from a buffer</td></tr> | |
| 47 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.SeekableByteChannel}</i></tt></td> | |
| 48 | + * <td>A {@code ByteChannel} connected to an entity that contains a variable-length sequence of bytes</td></tr> | |
| 49 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.AsynchronousChannel}</i></tt></td> | |
| 50 | + * <td>Supports asynchronous I/O operations.</td></tr> | |
| 51 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.AsynchronousByteChannel}</i></tt></td> | |
| 52 | + * <td>Can read and write bytes asynchronously</td></tr> | |
| 53 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.NetworkChannel}</i></tt></td> | |
| 54 | + * <td>A channel to a network socket</td></tr> | |
| 55 | + * <tr><td valign=top><tt> <i>{@link java.nio.channels.MulticastChannel}</i></tt></td> | |
| 56 | + * <td>Can join Internet Protocol (IP) multicast groups</td></tr> | |
| 57 | + * <tr><td valign=top><tt>{@link java.nio.channels.Channels}</tt></td> | |
| 58 | + * <td>Utility methods for channel/stream interoperation</td></tr> | |
| 59 | + * </table></blockquote> | |
| 60 | + * | |
| 61 | + * <p> A <i>channel</i> represents an open connection to an entity such as a | |
| 62 | + * hardware device, a file, a network socket, or a program component that is | |
| 63 | + * capable of performing one or more distinct I/O operations, for example reading | |
| 64 | + * or writing. As specified in the {@link java.nio.channels.Channel} interface, | |
| 65 | + * channels are either open or closed, and they are both <i>asynchronously | |
| 66 | + * closeable</i> and <i>interruptible</i>. | |
| 67 | + * | |
| 68 | + * <p> The {@link java.nio.channels.Channel} interface is extended by several | |
| 69 | + * other interfaces. | |
| 70 | + * | |
| 71 | + * <p> The {@link java.nio.channels.ReadableByteChannel} interface specifies a | |
| 72 | + * {@link java.nio.channels.ReadableByteChannel#read read} method that reads bytes | |
| 73 | + * from the channel into a buffer; similarly, the {@link | |
| 74 | + * java.nio.channels.WritableByteChannel} interface specifies a {@link | |
| 75 | + * java.nio.channels.WritableByteChannel#write write} method that writes bytes | |
| 76 | + * from a buffer to the channel. The {@link java.nio.channels.ByteChannel} | |
| 77 | + * interface unifies these two interfaces for the common case of channels that can | |
| 78 | + * both read and write bytes. The {@link java.nio.channels.SeekableByteChannel} | |
| 79 | + * interface extends the {@code ByteChannel} interface with methods to {@link | |
| 80 | + * java.nio.channels.SeekableByteChannel#position() query} and {@link | |
| 81 | + * java.nio.channels.SeekableByteChannel#position(long) modify} the channel's | |
| 82 | + * current position, and its {@link java.nio.channels.SeekableByteChannel#size | |
| 83 | + * size}. | |
| 84 | + * | |
| 85 | + * <p> The {@link java.nio.channels.ScatteringByteChannel} and {@link | |
| 86 | + * java.nio.channels.GatheringByteChannel} interfaces extend the {@link | |
| 87 | + * java.nio.channels.ReadableByteChannel} and {@link | |
| 88 | + * java.nio.channels.WritableByteChannel} interfaces, respectively, adding {@link | |
| 89 | + * java.nio.channels.ScatteringByteChannel#read read} and {@link | |
| 90 | + * java.nio.channels.GatheringByteChannel#write write} methods that take a | |
| 91 | + * sequence of buffers rather than a single buffer. | |
| 92 | + * | |
| 93 | + * <p> The {@link java.nio.channels.NetworkChannel} interface specifies methods | |
| 94 | + * to {@link java.nio.channels.NetworkChannel#bind bind} the channel's socket, | |
| 95 | + * obtain the address to which the socket is bound, and methods to {@link | |
| 96 | + * java.nio.channels.NetworkChannel#getOption get} and {@link | |
| 97 | + * java.nio.channels.NetworkChannel#setOption set} socket options. The {@link | |
| 98 | + * java.nio.channels.MulticastChannel} interface specifies methods to join | |
| 99 | + * Internet Protocol (IP) multicast groups. | |
| 100 | + * | |
| 101 | + * <p> The {@link java.nio.channels.Channels} utility class defines static methods | |
| 102 | + * that support the interoperation of the stream classes of the <tt>{@link | |
| 103 | + * java.io}</tt> package with the channel classes of this package. An appropriate | |
| 104 | + * channel can be constructed from an {@link java.io.InputStream} or an {@link | |
| 105 | + * java.io.OutputStream}, and conversely an {@link java.io.InputStream} or an | |
| 106 | + * {@link java.io.OutputStream} can be constructed from a channel. A {@link | |
| 107 | + * java.io.Reader} can be constructed that uses a given charset to decode bytes | |
| 108 | + * from a given readable byte channel, and conversely a {@link java.io.Writer} can | |
| 109 | + * be constructed that uses a given charset to encode characters into bytes and | |
| 110 | + * write them to a given writable byte channel. | |
| 111 | + * | |
| 112 | + * <blockquote><table cellspacing=1 cellpadding=0 summary="Lists file channels and their descriptions"> | |
| 113 | + * <tr><th><p align="left">File channels</p></th><th><p align="left">Description</p></th></tr> | |
| 114 | + * <tr><td valign=top><tt>{@link java.nio.channels.FileChannel}</tt></td> | |
| 115 | + * <td>Reads, writes, maps, and manipulates files</td></tr> | |
| 116 | + * <tr><td valign=top><tt>{@link java.nio.channels.FileLock}</tt></td> | |
| 117 | + * <td>A lock on a (region of a) file</td></tr> | |
| 118 | + * <tr><td valign=top><tt>{@link java.nio.MappedByteBuffer} </tt></td> | |
| 119 | + * <td>A direct byte buffer mapped to a region of a file</td></tr> | |
| 120 | + * </table></blockquote> | |
| 121 | + * | |
| 122 | + * <p> The {@link java.nio.channels.FileChannel} class supports the usual | |
| 123 | + * operations of reading bytes from, and writing bytes to, a channel connected to | |
| 124 | + * a file, as well as those of querying and modifying the current file position | |
| 125 | + * and truncating the file to a specific size. It defines methods for acquiring | |
| 126 | + * locks on the whole file or on a specific region of a file; these methods return | |
| 127 | + * instances of the {@link java.nio.channels.FileLock} class. Finally, it defines | |
| 128 | + * methods for forcing updates to the file to be written to the storage device that | |
| 129 | + * contains it, for efficiently transferring bytes between the file and other | |
| 130 | + * channels, and for mapping a region of the file directly into memory. | |
| 131 | + * | |
| 132 | + * <p> A {@code FileChannel} is created by invoking one of its static {@link | |
| 133 | + * java.nio.channels.FileChannel#open open} methods, or by invoking the {@code | |
| 134 | + * getChannel} method of a {@link java.io.FileInputStream}, {@link | |
| 135 | + * java.io.FileOutputStream}, or {@link java.io.RandomAccessFile} to return a | |
| 136 | + * file channel connected to the same underlying file as the <tt>{@link java.io}</tt> | |
| 137 | + * class. | |
| 138 | + * | |
| 139 | + * <a name="multiplex"></a> | |
| 140 | + * <blockquote><table cellspacing=1 cellpadding=0 summary="Lists multiplexed, non-blocking channels and their descriptions"> | |
| 141 | + * <tr><th><p align="left">Multiplexed, non-blocking I/O</p></th><th><p align="left">Description</p></th></tr> | |
| 142 | + * <tr><td valign=top><tt>{@link java.nio.channels.SelectableChannel}</tt></td> | |
| 143 | + * <td>A channel that can be multiplexed</td></tr> | |
| 144 | + * <tr><td valign=top><tt> {@link java.nio.channels.DatagramChannel}</tt></td> | |
| 145 | + * <td>A channel to a datagram-oriented socket</td></tr> | |
| 146 | + * <tr><td valign=top><tt> {@link java.nio.channels.Pipe.SinkChannel}</tt></td> | |
| 147 | + * <td>The write end of a pipe</td></tr> | |
| 148 | + * <tr><td valign=top><tt> {@link java.nio.channels.Pipe.SourceChannel}</tt></td> | |
| 149 | + * <td>The read end of a pipe</td></tr> | |
| 150 | + * <tr><td valign=top><tt> {@link java.nio.channels.ServerSocketChannel} </tt></td> | |
| 151 | + * <td>A channel to a stream-oriented listening socket</td></tr> | |
| 152 | + * <tr><td valign=top><tt> {@link java.nio.channels.SocketChannel}</tt></td> | |
| 153 | + * <td>A channel for a stream-oriented connecting socket</td></tr> | |
| 154 | + * <tr><td valign=top><tt>{@link java.nio.channels.Selector}</tt></td> | |
| 155 | + * <td>A multiplexor of selectable channels</td></tr> | |
| 156 | + * <tr><td valign=top><tt>{@link java.nio.channels.SelectionKey}</tt></td> | |
| 157 | + * <td>A token representing the registration <br> of a channel | |
| 158 | + * with a selector</td></tr> | |
| 159 | + * <tr><td valign=top><tt>{@link java.nio.channels.Pipe}</tt></td> | |
| 160 | + * <td>Two channels that form a unidirectional pipe</td></tr> | |
| 161 | + * </table></blockquote> | |
| 162 | + * | |
| 163 | + * <p> Multiplexed, non-blocking I/O, which is much more scalable than | |
| 164 | + * thread-oriented, blocking I/O, is provided by <i>selectors</i>, <i>selectable | |
| 165 | + * channels</i>, and <i>selection keys</i>. | |
| 166 | + * | |
| 167 | + * <p> A <a href="Selector.html"><i>selector</i></a> is a multiplexor of <a | |
| 168 | + * href="SelectableChannel.html"><i>selectable channels</i></a>, which in turn are | |
| 169 | + * a special type of channel that can be put into <a | |
| 170 | + * href="SelectableChannel.html#bm"><i>non-blocking mode</i></a>. To perform | |
| 171 | + * multiplexed I/O operations, one or more selectable channels are first created, | |
| 172 | + * put into non-blocking mode, and {@link | |
| 173 | + * java.nio.channels.SelectableChannel#register <i>registered</i>} | |
| 174 | + * with a selector. Registering a channel specifies the set of I/O operations | |
| 175 | + * that will be tested for readiness by the selector, and returns a <a | |
| 176 | + * href="SelectionKey.html"><i>selection key</i></a> that represents the | |
| 177 | + * registration. | |
| 178 | + * | |
| 179 | + * <p> Once some channels have been registered with a selector, a <a | |
| 180 | + * href="Selector.html#selop"><i>selection operation</i></a> can be performed in | |
| 181 | + * order to discover which channels, if any, have become ready to perform one or | |
| 182 | + * more of the operations in which interest was previously declared. If a channel | |
| 183 | + * is ready then the key returned when it was registered will be added to the | |
| 184 | + * selector's <i>selected-key set</i>. The key set, and the keys within it, can | |
| 185 | + * be examined in order to determine the operations for which each channel is | |
| 186 | + * ready. From each key one can retrieve the corresponding channel in order to | |
| 187 | + * perform whatever I/O operations are required. | |
| 188 | + * | |
| 189 | + * <p> That a selection key indicates that its channel is ready for some operation | |
| 190 | + * is a hint, but not a guarantee, that such an operation can be performed by a | |
| 191 | + * thread without causing the thread to block. It is imperative that code that | |
| 192 | + * performs multiplexed I/O be written so as to ignore these hints when they prove | |
| 193 | + * to be incorrect. | |
| 194 | + * | |
| 195 | + * <p> This package defines selectable-channel classes corresponding to the {@link | |
| 196 | + * java.net.DatagramSocket}, {@link java.net.ServerSocket}, and {@link | |
| 197 | + * java.net.Socket} classes defined in the <tt>{@link java.net}</tt> package. | |
| 198 | + * Minor changes to these classes have been made in order to support sockets that | |
| 199 | + * are associated with channels. This package also defines a simple class that | |
| 200 | + * implements unidirectional pipes. In all cases, a new selectable channel is | |
| 201 | + * created by invoking the static <tt>open</tt> method of the corresponding class. | |
| 202 | + * If a channel needs an associated socket then a socket will be created as a side | |
| 203 | + * effect of this operation. | |
| 204 | + * | |
| 205 | + * <p> The implementation of selectors, selectable channels, and selection keys | |
| 206 | + * can be replaced by "plugging in" an alternative definition or instance of the | |
| 207 | + * {@link java.nio.channels.spi.SelectorProvider} class defined in the <tt>{@link | |
| 208 | + * java.nio.channels.spi}</tt> package. It is not expected that many developers | |
| 209 | + * will actually make use of this facility; it is provided primarily so that | |
| 210 | + * sophisticated users can take advantage of operating-system-specific | |
| 211 | + * I/O-multiplexing mechanisms when very high performance is required. | |
| 212 | + * | |
| 213 | + * <p> Much of the bookkeeping and synchronization required to implement the | |
| 214 | + * multiplexed-I/O abstractions is performed by the {@link | |
| 215 | + * java.nio.channels.spi.AbstractInterruptibleChannel}, {@link | |
| 216 | + * java.nio.channels.spi.AbstractSelectableChannel}, {@link | |
| 217 | + * java.nio.channels.spi.AbstractSelectionKey}, and {@link | |
| 218 | + * java.nio.channels.spi.AbstractSelector} classes in the <tt>{@link | |
| 219 | + * java.nio.channels.spi}</tt> package. When defining a custom selector provider, | |
| 220 | + * only the {@link java.nio.channels.spi.AbstractSelector} and {@link | |
| 221 | + * java.nio.channels.spi.AbstractSelectionKey} classes should be subclassed | |
| 222 | + * directly; custom channel classes should extend the appropriate {@link | |
| 223 | + * java.nio.channels.SelectableChannel} subclasses defined in this package. | |
| 224 | + * | |
| 225 | + * <a name="async"></a> | |
| 226 | + * | |
| 227 | + * <blockquote><table cellspacing=1 cellpadding=0 summary="Lists asynchronous channels and their descriptions"> | |
| 228 | + * <tr><th><p align="left">Asynchronous I/O</p></th><th><p align="left">Description</p></th></tr> | |
| 229 | + * <tr><td valign=top><tt>{@link java.nio.channels.AsynchronousFileChannel}</tt></td> | |
| 230 | + * <td>An asynchronous channel for reading, writing, and manipulating a file</td></tr> | |
| 231 | + * <tr><td valign=top><tt>{@link java.nio.channels.AsynchronousSocketChannel}</tt></td> | |
| 232 | + * <td>An asynchronous channel to a stream-oriented connecting socket</td></tr> | |
| 233 | + * <tr><td valign=top><tt>{@link java.nio.channels.AsynchronousServerSocketChannel} </tt></td> | |
| 234 | + * <td>An asynchronous channel to a stream-oriented listening socket</td></tr> | |
| 235 | + * <tr><td valign=top><tt>{@link java.nio.channels.CompletionHandler}</tt></td> | |
| 236 | + * <td>A handler for consuming the result of an asynchronous operation</td></tr> | |
| 237 | + * <tr><td valign=top><tt>{@link java.nio.channels.AsynchronousChannelGroup}</tt></td> | |
| 238 | + * <td>A grouping of asynchronous channels for the purpose of resource sharing</td></tr> | |
| 239 | + * </table></blockquote> | |
| 240 | + * | |
| 241 | + * <p> {@link java.nio.channels.AsynchronousChannel Asynchronous channels} are a | |
| 242 | + * special type of channel capable of asynchronous I/O operations. Asynchronous | |
| 243 | + * channels are non-blocking and define methods to initiate asynchronous | |
| 244 | + * operations, returning a {@link java.util.concurrent.Future} representing the | |
| 245 | + * pending result of each operation. The {@code Future} can be used to poll or | |
| 246 | + * wait for the result of the operation. Asynchronous I/O operations can also | |
| 247 | + * specify a {@link java.nio.channels.CompletionHandler} to invoke when the | |
| 248 | + * operation completes. A completion handler is user provided code that is executed | |
| 249 | + * to consume the result of I/O operation. | |
| 250 | + * | |
| 251 | + * <p> This package defines asynchronous-channel classes that are connected to | |
| 252 | + * a stream-oriented connecting or listening socket, or a datagram-oriented socket. | |
| 253 | + * It also defines the {@link java.nio.channels.AsynchronousFileChannel} class | |
| 254 | + * for asynchronous reading, writing, and manipulating a file. As with the {@link | |
| 255 | + * java.nio.channels.FileChannel} it supports operations to truncate the file | |
| 256 | + * to a specific size, force updates to the file to be written to the storage | |
| 257 | + * device, or acquire locks on the whole file or on a specific region of the file. | |
| 258 | + * Unlike the {@code FileChannel} it does not define methods for mapping a | |
| 259 | + * region of the file directly into memory. Where memory mapped I/O is required, | |
| 260 | + * then a {@code FileChannel} can be used. | |
| 261 | + * | |
| 262 | + * <p> Asynchronous channels are bound to an asynchronous channel group for the | |
| 263 | + * purpose of resource sharing. A group has an associated {@link | |
| 264 | + * java.util.concurrent.ExecutorService} to which tasks are submitted to handle | |
| 265 | + * I/O events and dispatch to completion handlers that consume the result of | |
| 266 | + * asynchronous operations performed on channels in the group. The group can | |
| 267 | + * optionally be specified when creating the channel or the channel can be bound | |
| 268 | + * to a <em>default group</em>. Sophisticated users may wish to create their | |
| 269 | + * own asynchronous channel groups or configure the {@code ExecutorService} | |
| 270 | + * that will be used for the default group. | |
| 271 | + * | |
| 272 | + * <p> As with selectors, the implementatin of asynchronous channels can be | |
| 273 | + * replaced by "plugging in" an alternative definition or instance of the {@link | |
| 274 | + * java.nio.channels.spi.AsynchronousChannelProvider} class defined in the | |
| 275 | + * <tt>{@link java.nio.channels.spi}</tt> package. It is not expected that many | |
| 276 | + * developers will actually make use of this facility; it is provided primarily | |
| 277 | + * so that sophisticated users can take advantage of operating-system-specific | |
| 278 | + * asynchronous I/O mechanisms when very high performance is required. | |
| 279 | + * | |
| 280 | + * <hr width="80%"> | |
| 281 | + * <p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor | |
| 282 | + * or method in any class or interface in this package will cause a {@link | |
| 283 | + * java.lang.NullPointerException NullPointerException} to be thrown. | |
| 284 | + * | |
| 285 | + * @since 1.4 | |
| 286 | + * @author Mark Reinhold | |
| 287 | + * @author JSR-51 Expert Group | |
| 288 | + */ | |
| 289 | + | |
| 290 | +package java.nio.channels; | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,214 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2010, 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 | +/* | |
| 27 | + */ | |
| 28 | + | |
| 29 | +package java.nio.channels.spi; | |
| 30 | + | |
| 31 | +import java.io.IOException; | |
| 32 | +import java.lang.reflect.Method; | |
| 33 | +import java.lang.reflect.InvocationTargetException; | |
| 34 | +import java.nio.channels.*; | |
| 35 | +import java.security.AccessController; | |
| 36 | +import java.security.PrivilegedAction; | |
| 37 | +import sun.nio.ch.Interruptible; | |
| 38 | + | |
| 39 | + | |
| 40 | +/** | |
| 41 | + * Base implementation class for interruptible channels. | |
| 42 | + * | |
| 43 | + * <p> This class encapsulates the low-level machinery required to implement | |
| 44 | + * the asynchronous closing and interruption of channels. A concrete channel | |
| 45 | + * class must invoke the {@link #begin begin} and {@link #end end} methods | |
| 46 | + * before and after, respectively, invoking an I/O operation that might block | |
| 47 | + * indefinitely. In order to ensure that the {@link #end end} method is always | |
| 48 | + * invoked, these methods should be used within a | |
| 49 | + * <tt>try</tt> ... <tt>finally</tt> block: <a name="be"> | |
| 50 | + * | |
| 51 | + * <blockquote><pre> | |
| 52 | + * boolean completed = false; | |
| 53 | + * try { | |
| 54 | + * begin(); | |
| 55 | + * completed = ...; // Perform blocking I/O operation | |
| 56 | + * return ...; // Return result | |
| 57 | + * } finally { | |
| 58 | + * end(completed); | |
| 59 | + * }</pre></blockquote> | |
| 60 | + * | |
| 61 | + * <p> The <tt>completed</tt> argument to the {@link #end end} method tells | |
| 62 | + * whether or not the I/O operation actually completed, that is, whether it had | |
| 63 | + * any effect that would be visible to the invoker. In the case of an | |
| 64 | + * operation that reads bytes, for example, this argument should be | |
| 65 | + * <tt>true</tt> if, and only if, some bytes were actually transferred into the | |
| 66 | + * invoker's target buffer. | |
| 67 | + * | |
| 68 | + * <p> A concrete channel class must also implement the {@link | |
| 69 | + * #implCloseChannel implCloseChannel} method in such a way that if it is | |
| 70 | + * invoked while another thread is blocked in a native I/O operation upon the | |
| 71 | + * channel then that operation will immediately return, either by throwing an | |
| 72 | + * exception or by returning normally. If a thread is interrupted or the | |
| 73 | + * channel upon which it is blocked is asynchronously closed then the channel's | |
| 74 | + * {@link #end end} method will throw the appropriate exception. | |
| 75 | + * | |
| 76 | + * <p> This class performs the synchronization required to implement the {@link | |
| 77 | + * java.nio.channels.Channel} specification. Implementations of the {@link | |
| 78 | + * #implCloseChannel implCloseChannel} method need not synchronize against | |
| 79 | + * other threads that might be attempting to close the channel. </p> | |
| 80 | + * | |
| 81 | + * | |
| 82 | + * @author Mark Reinhold | |
| 83 | + * @author JSR-51 Expert Group | |
| 84 | + * @since 1.4 | |
| 85 | + */ | |
| 86 | + | |
| 87 | +public abstract class AbstractInterruptibleChannel | |
| 88 | + implements Channel, InterruptibleChannel | |
| 89 | +{ | |
| 90 | + | |
| 91 | + private final Object closeLock = new Object(); | |
| 92 | + private volatile boolean open = true; | |
| 93 | + | |
| 94 | + /** | |
| 95 | + * Initializes a new instance of this class. | |
| 96 | + */ | |
| 97 | + protected AbstractInterruptibleChannel() { } | |
| 98 | + | |
| 99 | + /** | |
| 100 | + * Closes this channel. | |
| 101 | + * | |
| 102 | + * <p> If the channel has already been closed then this method returns | |
| 103 | + * immediately. Otherwise it marks the channel as closed and then invokes | |
| 104 | + * the {@link #implCloseChannel implCloseChannel} method in order to | |
| 105 | + * complete the close operation. </p> | |
| 106 | + * | |
| 107 | + * @throws IOException | |
| 108 | + * If an I/O error occurs | |
| 109 | + */ | |
| 110 | + public final void close() throws IOException { | |
| 111 | + synchronized (closeLock) { | |
| 112 | + if (!open) | |
| 113 | + return; | |
| 114 | + open = false; | |
| 115 | + implCloseChannel(); | |
| 116 | + } | |
| 117 | + } | |
| 118 | + | |
| 119 | + /** | |
| 120 | + * Closes this channel. | |
| 121 | + * | |
| 122 | + * <p> This method is invoked by the {@link #close close} method in order | |
| 123 | + * to perform the actual work of closing the channel. This method is only | |
| 124 | + * invoked if the channel has not yet been closed, and it is never invoked | |
| 125 | + * more than once. | |
| 126 | + * | |
| 127 | + * <p> An implementation of this method must arrange for any other thread | |
| 128 | + * that is blocked in an I/O operation upon this channel to return | |
| 129 | + * immediately, either by throwing an exception or by returning normally. | |
| 130 | + * </p> | |
| 131 | + * | |
| 132 | + * @throws IOException | |
| 133 | + * If an I/O error occurs while closing the channel | |
| 134 | + */ | |
| 135 | + protected abstract void implCloseChannel() throws IOException; | |
| 136 | + | |
| 137 | + public final boolean isOpen() { | |
| 138 | + return open; | |
| 139 | + } | |
| 140 | + | |
| 141 | + | |
| 142 | + // -- Interruption machinery -- | |
| 143 | + | |
| 144 | + private Interruptible interruptor; | |
| 145 | + private volatile Thread interrupted; | |
| 146 | + | |
| 147 | + /** | |
| 148 | + * Marks the beginning of an I/O operation that might block indefinitely. | |
| 149 | + * | |
| 150 | + * <p> This method should be invoked in tandem with the {@link #end end} | |
| 151 | + * method, using a <tt>try</tt> ... <tt>finally</tt> block as | |
| 152 | + * shown <a href="#be">above</a>, in order to implement asynchronous | |
| 153 | + * closing and interruption for this channel. </p> | |
| 154 | + */ | |
| 155 | + protected final void begin() { | |
| 156 | + if (interruptor == null) { | |
| 157 | + interruptor = new Interruptible() { | |
| 158 | + public void interrupt(Thread target) { | |
| 159 | + synchronized (closeLock) { | |
| 160 | + if (!open) | |
| 161 | + return; | |
| 162 | + open = false; | |
| 163 | + interrupted = target; | |
| 164 | + try { | |
| 165 | + AbstractInterruptibleChannel.this.implCloseChannel(); | |
| 166 | + } catch (IOException x) { } | |
| 167 | + } | |
| 168 | + }}; | |
| 169 | + } | |
| 170 | + blockedOn(interruptor); | |
| 171 | + Thread me = Thread.currentThread(); | |
| 172 | + if (me.isInterrupted()) | |
| 173 | + interruptor.interrupt(me); | |
| 174 | + } | |
| 175 | + | |
| 176 | + /** | |
| 177 | + * Marks the end of an I/O operation that might block indefinitely. | |
| 178 | + * | |
| 179 | + * <p> This method should be invoked in tandem with the {@link #begin | |
| 180 | + * begin} method, using a <tt>try</tt> ... <tt>finally</tt> block | |
| 181 | + * as shown <a href="#be">above</a>, in order to implement asynchronous | |
| 182 | + * closing and interruption for this channel. </p> | |
| 183 | + * | |
| 184 | + * @param completed | |
| 185 | + * <tt>true</tt> if, and only if, the I/O operation completed | |
| 186 | + * successfully, that is, had some effect that would be visible to | |
| 187 | + * the operation's invoker | |
| 188 | + * | |
| 189 | + * @throws AsynchronousCloseException | |
| 190 | + * If the channel was asynchronously closed | |
| 191 | + * | |
| 192 | + * @throws ClosedByInterruptException | |
| 193 | + * If the thread blocked in the I/O operation was interrupted | |
| 194 | + */ | |
| 195 | + protected final void end(boolean completed) | |
| 196 | + throws AsynchronousCloseException | |
| 197 | + { | |
| 198 | + blockedOn(null); | |
| 199 | + Thread interrupted = this.interrupted; | |
| 200 | + if (interrupted != null && interrupted == Thread.currentThread()) { | |
| 201 | + interrupted = null; | |
| 202 | + throw new ClosedByInterruptException(); | |
| 203 | + } | |
| 204 | + if (!completed && !open) | |
| 205 | + throw new AsynchronousCloseException(); | |
| 206 | + } | |
| 207 | + | |
| 208 | + | |
| 209 | + // -- sun.misc.SharedSecrets -- | |
| 210 | + static void blockedOn(Interruptible intr) { // package-private | |
| 211 | + sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), | |
| 212 | + intr); | |
| 213 | + } | |
| 214 | +} | |
Binary file not shown.
| @@ -0,0 +1,305 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2008, 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.spi; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.nio.channels.*; | |
| 30 | + | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * Base implementation class for selectable channels. | |
| 34 | + * | |
| 35 | + * <p> This class defines methods that handle the mechanics of channel | |
| 36 | + * registration, deregistration, and closing. It maintains the current | |
| 37 | + * blocking mode of this channel as well as its current set of selection keys. | |
| 38 | + * It performs all of the synchronization required to implement the {@link | |
| 39 | + * java.nio.channels.SelectableChannel} specification. Implementations of the | |
| 40 | + * abstract protected methods defined in this class need not synchronize | |
| 41 | + * against other threads that might be engaged in the same operations. </p> | |
| 42 | + * | |
| 43 | + * | |
| 44 | + * @author Mark Reinhold | |
| 45 | + * @author Mike McCloskey | |
| 46 | + * @author JSR-51 Expert Group | |
| 47 | + * @since 1.4 | |
| 48 | + */ | |
| 49 | + | |
| 50 | +public abstract class AbstractSelectableChannel | |
| 51 | + extends SelectableChannel | |
| 52 | +{ | |
| 53 | + | |
| 54 | + // The provider that created this channel | |
| 55 | + private final SelectorProvider provider; | |
| 56 | + | |
| 57 | + // Keys that have been created by registering this channel with selectors. | |
| 58 | + // They are saved because if this channel is closed the keys must be | |
| 59 | + // deregistered. Protected by keyLock. | |
| 60 | + // | |
| 61 | + private SelectionKey[] keys = null; | |
| 62 | + private int keyCount = 0; | |
| 63 | + | |
| 64 | + // Lock for key set and count | |
| 65 | + private final Object keyLock = new Object(); | |
| 66 | + | |
| 67 | + // Lock for registration and configureBlocking operations | |
| 68 | + private final Object regLock = new Object(); | |
| 69 | + | |
| 70 | + // Blocking mode, protected by regLock | |
| 71 | + boolean blocking = true; | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * Initializes a new instance of this class. | |
| 75 | + */ | |
| 76 | + protected AbstractSelectableChannel(SelectorProvider provider) { | |
| 77 | + this.provider = provider; | |
| 78 | + } | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Returns the provider that created this channel. | |
| 82 | + * | |
| 83 | + * @return The provider that created this channel | |
| 84 | + */ | |
| 85 | + public final SelectorProvider provider() { | |
| 86 | + return provider; | |
| 87 | + } | |
| 88 | + | |
| 89 | + | |
| 90 | + // -- Utility methods for the key set -- | |
| 91 | + | |
| 92 | + private void addKey(SelectionKey k) { | |
| 93 | + synchronized (keyLock) { | |
| 94 | + int i = 0; | |
| 95 | + if ((keys != null) && (keyCount < keys.length)) { | |
| 96 | + // Find empty element of key array | |
| 97 | + for (i = 0; i < keys.length; i++) | |
| 98 | + if (keys[i] == null) | |
| 99 | + break; | |
| 100 | + } else if (keys == null) { | |
| 101 | + keys = new SelectionKey[3]; | |
| 102 | + } else { | |
| 103 | + // Grow key array | |
| 104 | + int n = keys.length * 2; | |
| 105 | + SelectionKey[] ks = new SelectionKey[n]; | |
| 106 | + for (i = 0; i < keys.length; i++) | |
| 107 | + ks[i] = keys[i]; | |
| 108 | + keys = ks; | |
| 109 | + i = keyCount; | |
| 110 | + } | |
| 111 | + keys[i] = k; | |
| 112 | + keyCount++; | |
| 113 | + } | |
| 114 | + } | |
| 115 | + | |
| 116 | + private SelectionKey findKey(Selector sel) { | |
| 117 | + synchronized (keyLock) { | |
| 118 | + if (keys == null) | |
| 119 | + return null; | |
| 120 | + for (int i = 0; i < keys.length; i++) | |
| 121 | + if ((keys[i] != null) && (keys[i].selector() == sel)) | |
| 122 | + return keys[i]; | |
| 123 | + return null; | |
| 124 | + } | |
| 125 | + } | |
| 126 | + | |
| 127 | + void removeKey(SelectionKey k) { // package-private | |
| 128 | + synchronized (keyLock) { | |
| 129 | + for (int i = 0; i < keys.length; i++) | |
| 130 | + if (keys[i] == k) { | |
| 131 | + keys[i] = null; | |
| 132 | + keyCount--; | |
| 133 | + } | |
| 134 | + ((AbstractSelectionKey)k).invalidate(); | |
| 135 | + } | |
| 136 | + } | |
| 137 | + | |
| 138 | + private boolean haveValidKeys() { | |
| 139 | + synchronized (keyLock) { | |
| 140 | + if (keyCount == 0) | |
| 141 | + return false; | |
| 142 | + for (int i = 0; i < keys.length; i++) { | |
| 143 | + if ((keys[i] != null) && keys[i].isValid()) | |
| 144 | + return true; | |
| 145 | + } | |
| 146 | + return false; | |
| 147 | + } | |
| 148 | + } | |
| 149 | + | |
| 150 | + | |
| 151 | + // -- Registration -- | |
| 152 | + | |
| 153 | + public final boolean isRegistered() { | |
| 154 | + synchronized (keyLock) { | |
| 155 | + return keyCount != 0; | |
| 156 | + } | |
| 157 | + } | |
| 158 | + | |
| 159 | + public final SelectionKey keyFor(Selector sel) { | |
| 160 | + return findKey(sel); | |
| 161 | + } | |
| 162 | + | |
| 163 | + /** | |
| 164 | + * Registers this channel with the given selector, returning a selection key. | |
| 165 | + * | |
| 166 | + * <p> This method first verifies that this channel is open and that the | |
| 167 | + * given initial interest set is valid. | |
| 168 | + * | |
| 169 | + * <p> If this channel is already registered with the given selector then | |
| 170 | + * the selection key representing that registration is returned after | |
| 171 | + * setting its interest set to the given value. | |
| 172 | + * | |
| 173 | + * <p> Otherwise this channel has not yet been registered with the given | |
| 174 | + * selector, so the {@link AbstractSelector#register register} method of | |
| 175 | + * the selector is invoked while holding the appropriate locks. The | |
| 176 | + * resulting key is added to this channel's key set before being returned. | |
| 177 | + * </p> | |
| 178 | + * | |
| 179 | + * @throws ClosedSelectorException {@inheritDoc} | |
| 180 | + * | |
| 181 | + * @throws IllegalBlockingModeException {@inheritDoc} | |
| 182 | + * | |
| 183 | + * @throws IllegalSelectorException {@inheritDoc} | |
| 184 | + * | |
| 185 | + * @throws CancelledKeyException {@inheritDoc} | |
| 186 | + * | |
| 187 | + * @throws IllegalArgumentException {@inheritDoc} | |
| 188 | + */ | |
| 189 | + public final SelectionKey register(Selector sel, int ops, | |
| 190 | + Object att) | |
| 191 | + throws ClosedChannelException | |
| 192 | + { | |
| 193 | + if (!isOpen()) | |
| 194 | + throw new ClosedChannelException(); | |
| 195 | + if ((ops & ~validOps()) != 0) | |
| 196 | + throw new IllegalArgumentException(); | |
| 197 | + synchronized (regLock) { | |
| 198 | + if (blocking) | |
| 199 | + throw new IllegalBlockingModeException(); | |
| 200 | + SelectionKey k = findKey(sel); | |
| 201 | + if (k != null) { | |
| 202 | + k.interestOps(ops); | |
| 203 | + k.attach(att); | |
| 204 | + } | |
| 205 | + if (k == null) { | |
| 206 | + // New registration | |
| 207 | + k = ((AbstractSelector)sel).register(this, ops, att); | |
| 208 | + addKey(k); | |
| 209 | + } | |
| 210 | + return k; | |
| 211 | + } | |
| 212 | + } | |
| 213 | + | |
| 214 | + | |
| 215 | + // -- Closing -- | |
| 216 | + | |
| 217 | + /** | |
| 218 | + * Closes this channel. | |
| 219 | + * | |
| 220 | + * <p> This method, which is specified in the {@link | |
| 221 | + * AbstractInterruptibleChannel} class and is invoked by the {@link | |
| 222 | + * java.nio.channels.Channel#close close} method, in turn invokes the | |
| 223 | + * {@link #implCloseSelectableChannel implCloseSelectableChannel} method in | |
| 224 | + * order to perform the actual work of closing this channel. It then | |
| 225 | + * cancels all of this channel's keys. </p> | |
| 226 | + */ | |
| 227 | + protected final void implCloseChannel() throws IOException { | |
| 228 | + implCloseSelectableChannel(); | |
| 229 | + synchronized (keyLock) { | |
| 230 | + int count = (keys == null) ? 0 : keys.length; | |
| 231 | + for (int i = 0; i < count; i++) { | |
| 232 | + SelectionKey k = keys[i]; | |
| 233 | + if (k != null) | |
| 234 | + k.cancel(); | |
| 235 | + } | |
| 236 | + } | |
| 237 | + } | |
| 238 | + | |
| 239 | + /** | |
| 240 | + * Closes this selectable channel. | |
| 241 | + * | |
| 242 | + * <p> This method is invoked by the {@link java.nio.channels.Channel#close | |
| 243 | + * close} method in order to perform the actual work of closing the | |
| 244 | + * channel. This method is only invoked if the channel has not yet been | |
| 245 | + * closed, and it is never invoked more than once. | |
| 246 | + * | |
| 247 | + * <p> An implementation of this method must arrange for any other thread | |
| 248 | + * that is blocked in an I/O operation upon this channel to return | |
| 249 | + * immediately, either by throwing an exception or by returning normally. | |
| 250 | + * </p> | |
| 251 | + */ | |
| 252 | + protected abstract void implCloseSelectableChannel() throws IOException; | |
| 253 | + | |
| 254 | + | |
| 255 | + // -- Blocking -- | |
| 256 | + | |
| 257 | + public final boolean isBlocking() { | |
| 258 | + synchronized (regLock) { | |
| 259 | + return blocking; | |
| 260 | + } | |
| 261 | + } | |
| 262 | + | |
| 263 | + public final Object blockingLock() { | |
| 264 | + return regLock; | |
| 265 | + } | |
| 266 | + | |
| 267 | + /** | |
| 268 | + * Adjusts this channel's blocking mode. | |
| 269 | + * | |
| 270 | + * <p> If the given blocking mode is different from the current blocking | |
| 271 | + * mode then this method invokes the {@link #implConfigureBlocking | |
| 272 | + * implConfigureBlocking} method, while holding the appropriate locks, in | |
| 273 | + * order to change the mode. </p> | |
| 274 | + */ | |
| 275 | + public final SelectableChannel configureBlocking(boolean block) | |
| 276 | + throws IOException | |
| 277 | + { | |
| 278 | + if (!isOpen()) | |
| 279 | + throw new ClosedChannelException(); | |
| 280 | + synchronized (regLock) { | |
| 281 | + if (blocking == block) | |
| 282 | + return this; | |
| 283 | + if (block && haveValidKeys()) | |
| 284 | + throw new IllegalBlockingModeException(); | |
| 285 | + implConfigureBlocking(block); | |
| 286 | + blocking = block; | |
| 287 | + } | |
| 288 | + return this; | |
| 289 | + } | |
| 290 | + | |
| 291 | + /** | |
| 292 | + * Adjusts this channel's blocking mode. | |
| 293 | + * | |
| 294 | + * <p> This method is invoked by the {@link #configureBlocking | |
| 295 | + * configureBlocking} method in order to perform the actual work of | |
| 296 | + * changing the blocking mode. This method is only invoked if the new mode | |
| 297 | + * is different from the current mode. </p> | |
| 298 | + * | |
| 299 | + * @throws IOException | |
| 300 | + * If an I/O error occurs | |
| 301 | + */ | |
| 302 | + protected abstract void implConfigureBlocking(boolean block) | |
| 303 | + throws IOException; | |
| 304 | + | |
| 305 | +} | |
Binary file not shown.
| @@ -0,0 +1,77 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2006, 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.spi; | |
| 27 | + | |
| 28 | +import java.nio.channels.*; | |
| 29 | + | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * Base implementation class for selection keys. | |
| 33 | + * | |
| 34 | + * <p> This class tracks the validity of the key and implements cancellation. | |
| 35 | + * | |
| 36 | + * @author Mark Reinhold | |
| 37 | + * @author JSR-51 Expert Group | |
| 38 | + * @since 1.4 | |
| 39 | + */ | |
| 40 | + | |
| 41 | +public abstract class AbstractSelectionKey | |
| 42 | + extends SelectionKey | |
| 43 | +{ | |
| 44 | + | |
| 45 | + /** | |
| 46 | + * Initializes a new instance of this class. </p> | |
| 47 | + */ | |
| 48 | + protected AbstractSelectionKey() { } | |
| 49 | + | |
| 50 | + private volatile boolean valid = true; | |
| 51 | + | |
| 52 | + public final boolean isValid() { | |
| 53 | + return valid; | |
| 54 | + } | |
| 55 | + | |
| 56 | + void invalidate() { // package-private | |
| 57 | + valid = false; | |
| 58 | + } | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * Cancels this key. | |
| 62 | + * | |
| 63 | + * <p> If this key has not yet been cancelled then it is added to its | |
| 64 | + * selector's cancelled-key set while synchronized on that set. </p> | |
| 65 | + */ | |
| 66 | + public final void cancel() { | |
| 67 | + // Synchronizing "this" to prevent this key from getting canceled | |
| 68 | + // multiple times by different threads, which might cause race | |
| 69 | + // condition between selector's select() and channel's close(). | |
| 70 | + synchronized (this) { | |
| 71 | + if (valid) { | |
| 72 | + valid = false; | |
| 73 | + ((AbstractSelector)selector()).cancel(this); | |
| 74 | + } | |
| 75 | + } | |
| 76 | + } | |
| 77 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,231 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2010, 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.spi; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.nio.channels.SelectionKey; | |
| 30 | +import java.nio.channels.Selector; | |
| 31 | +import java.util.HashSet; | |
| 32 | +import java.util.Set; | |
| 33 | +import sun.nio.ch.Interruptible; | |
| 34 | +import java.util.concurrent.atomic.AtomicBoolean; | |
| 35 | + | |
| 36 | + | |
| 37 | +/** | |
| 38 | + * Base implementation class for selectors. | |
| 39 | + * | |
| 40 | + * <p> This class encapsulates the low-level machinery required to implement | |
| 41 | + * the interruption of selection operations. A concrete selector class must | |
| 42 | + * invoke the {@link #begin begin} and {@link #end end} methods before and | |
| 43 | + * after, respectively, invoking an I/O operation that might block | |
| 44 | + * indefinitely. In order to ensure that the {@link #end end} method is always | |
| 45 | + * invoked, these methods should be used within a | |
| 46 | + * <tt>try</tt> ... <tt>finally</tt> block: <a name="be"> | |
| 47 | + * | |
| 48 | + * <blockquote><pre> | |
| 49 | + * try { | |
| 50 | + * begin(); | |
| 51 | + * // Perform blocking I/O operation here | |
| 52 | + * ... | |
| 53 | + * } finally { | |
| 54 | + * end(); | |
| 55 | + * }</pre></blockquote> | |
| 56 | + * | |
| 57 | + * <p> This class also defines methods for maintaining a selector's | |
| 58 | + * cancelled-key set and for removing a key from its channel's key set, and | |
| 59 | + * declares the abstract {@link #register register} method that is invoked by a | |
| 60 | + * selectable channel's {@link AbstractSelectableChannel#register register} | |
| 61 | + * method in order to perform the actual work of registering a channel. </p> | |
| 62 | + * | |
| 63 | + * | |
| 64 | + * @author Mark Reinhold | |
| 65 | + * @author JSR-51 Expert Group | |
| 66 | + * @since 1.4 | |
| 67 | + */ | |
| 68 | + | |
| 69 | +public abstract class AbstractSelector | |
| 70 | + extends Selector | |
| 71 | +{ | |
| 72 | + | |
| 73 | + private AtomicBoolean selectorOpen = new AtomicBoolean(true); | |
| 74 | + | |
| 75 | + // The provider that created this selector | |
| 76 | + private final SelectorProvider provider; | |
| 77 | + | |
| 78 | + /** | |
| 79 | + * Initializes a new instance of this class. </p> | |
| 80 | + */ | |
| 81 | + protected AbstractSelector(SelectorProvider provider) { | |
| 82 | + this.provider = provider; | |
| 83 | + } | |
| 84 | + | |
| 85 | + private final Set<SelectionKey> cancelledKeys = new HashSet<SelectionKey>(); | |
| 86 | + | |
| 87 | + void cancel(SelectionKey k) { // package-private | |
| 88 | + synchronized (cancelledKeys) { | |
| 89 | + cancelledKeys.add(k); | |
| 90 | + } | |
| 91 | + } | |
| 92 | + | |
| 93 | + /** | |
| 94 | + * Closes this selector. | |
| 95 | + * | |
| 96 | + * <p> If the selector has already been closed then this method returns | |
| 97 | + * immediately. Otherwise it marks the selector as closed and then invokes | |
| 98 | + * the {@link #implCloseSelector implCloseSelector} method in order to | |
| 99 | + * complete the close operation. </p> | |
| 100 | + * | |
| 101 | + * @throws IOException | |
| 102 | + * If an I/O error occurs | |
| 103 | + */ | |
| 104 | + public final void close() throws IOException { | |
| 105 | + boolean open = selectorOpen.getAndSet(false); | |
| 106 | + if (!open) | |
| 107 | + return; | |
| 108 | + implCloseSelector(); | |
| 109 | + } | |
| 110 | + | |
| 111 | + /** | |
| 112 | + * Closes this selector. | |
| 113 | + * | |
| 114 | + * <p> This method is invoked by the {@link #close close} method in order | |
| 115 | + * to perform the actual work of closing the selector. This method is only | |
| 116 | + * invoked if the selector has not yet been closed, and it is never invoked | |
| 117 | + * more than once. | |
| 118 | + * | |
| 119 | + * <p> An implementation of this method must arrange for any other thread | |
| 120 | + * that is blocked in a selection operation upon this selector to return | |
| 121 | + * immediately as if by invoking the {@link | |
| 122 | + * java.nio.channels.Selector#wakeup wakeup} method. </p> | |
| 123 | + * | |
| 124 | + * @throws IOException | |
| 125 | + * If an I/O error occurs while closing the selector | |
| 126 | + */ | |
| 127 | + protected abstract void implCloseSelector() throws IOException; | |
| 128 | + | |
| 129 | + public final boolean isOpen() { | |
| 130 | + return selectorOpen.get(); | |
| 131 | + } | |
| 132 | + | |
| 133 | + /** | |
| 134 | + * Returns the provider that created this channel. | |
| 135 | + * | |
| 136 | + * @return The provider that created this channel | |
| 137 | + */ | |
| 138 | + public final SelectorProvider provider() { | |
| 139 | + return provider; | |
| 140 | + } | |
| 141 | + | |
| 142 | + /** | |
| 143 | + * Retrieves this selector's cancelled-key set. | |
| 144 | + * | |
| 145 | + * <p> This set should only be used while synchronized upon it. </p> | |
| 146 | + * | |
| 147 | + * @return The cancelled-key set | |
| 148 | + */ | |
| 149 | + protected final Set<SelectionKey> cancelledKeys() { | |
| 150 | + return cancelledKeys; | |
| 151 | + } | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * Registers the given channel with this selector. | |
| 155 | + * | |
| 156 | + * <p> This method is invoked by a channel's {@link | |
| 157 | + * AbstractSelectableChannel#register register} method in order to perform | |
| 158 | + * the actual work of registering the channel with this selector. </p> | |
| 159 | + * | |
| 160 | + * @param ch | |
| 161 | + * The channel to be registered | |
| 162 | + * | |
| 163 | + * @param ops | |
| 164 | + * The initial interest set, which must be valid | |
| 165 | + * | |
| 166 | + * @param att | |
| 167 | + * The initial attachment for the resulting key | |
| 168 | + * | |
| 169 | + * @return A new key representing the registration of the given channel | |
| 170 | + * with this selector | |
| 171 | + */ | |
| 172 | + protected abstract SelectionKey register(AbstractSelectableChannel ch, | |
| 173 | + int ops, Object att); | |
| 174 | + | |
| 175 | + /** | |
| 176 | + * Removes the given key from its channel's key set. | |
| 177 | + * | |
| 178 | + * <p> This method must be invoked by the selector for each channel that it | |
| 179 | + * deregisters. </p> | |
| 180 | + * | |
| 181 | + * @param key | |
| 182 | + * The selection key to be removed | |
| 183 | + */ | |
| 184 | + protected final void deregister(AbstractSelectionKey key) { | |
| 185 | + ((AbstractSelectableChannel)key.channel()).removeKey(key); | |
| 186 | + } | |
| 187 | + | |
| 188 | + | |
| 189 | + // -- Interruption machinery -- | |
| 190 | + | |
| 191 | + private Interruptible interruptor = null; | |
| 192 | + | |
| 193 | + /** | |
| 194 | + * Marks the beginning of an I/O operation that might block indefinitely. | |
| 195 | + * | |
| 196 | + * <p> This method should be invoked in tandem with the {@link #end end} | |
| 197 | + * method, using a <tt>try</tt> ... <tt>finally</tt> block as | |
| 198 | + * shown <a href="#be">above</a>, in order to implement interruption for | |
| 199 | + * this selector. | |
| 200 | + * | |
| 201 | + * <p> Invoking this method arranges for the selector's {@link | |
| 202 | + * Selector#wakeup wakeup} method to be invoked if a thread's {@link | |
| 203 | + * Thread#interrupt interrupt} method is invoked while the thread is | |
| 204 | + * blocked in an I/O operation upon the selector. </p> | |
| 205 | + */ | |
| 206 | + protected final void begin() { | |
| 207 | + if (interruptor == null) { | |
| 208 | + interruptor = new Interruptible() { | |
| 209 | + public void interrupt(Thread ignore) { | |
| 210 | + AbstractSelector.this.wakeup(); | |
| 211 | + }}; | |
| 212 | + } | |
| 213 | + AbstractInterruptibleChannel.blockedOn(interruptor); | |
| 214 | + Thread me = Thread.currentThread(); | |
| 215 | + if (me.isInterrupted()) | |
| 216 | + interruptor.interrupt(me); | |
| 217 | + } | |
| 218 | + | |
| 219 | + /** | |
| 220 | + * Marks the end of an I/O operation that might block indefinitely. | |
| 221 | + * | |
| 222 | + * <p> This method should be invoked in tandem with the {@link #begin begin} | |
| 223 | + * method, using a <tt>try</tt> ... <tt>finally</tt> block as | |
| 224 | + * shown <a href="#be">above</a>, in order to implement interruption for | |
| 225 | + * this selector. </p> | |
| 226 | + */ | |
| 227 | + protected final void end() { | |
| 228 | + AbstractInterruptibleChannel.blockedOn(null); | |
| 229 | + } | |
| 230 | + | |
| 231 | +} | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,241 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2010, 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.spi; | |
| 27 | + | |
| 28 | +import java.nio.channels.*; | |
| 29 | +import java.io.IOException; | |
| 30 | +import java.util.Iterator; | |
| 31 | +import java.util.ServiceLoader; | |
| 32 | +import java.util.ServiceConfigurationError; | |
| 33 | +import java.util.concurrent.*; | |
| 34 | +import java.security.AccessController; | |
| 35 | +import java.security.PrivilegedAction; | |
| 36 | + | |
| 37 | +/** | |
| 38 | + * Service-provider class for asynchronous channels. | |
| 39 | + * | |
| 40 | + * <p> An asynchronous channel provider is a concrete subclass of this class that | |
| 41 | + * has a zero-argument constructor and implements the abstract methods specified | |
| 42 | + * below. A given invocation of the Java virtual machine maintains a single | |
| 43 | + * system-wide default provider instance, which is returned by the {@link | |
| 44 | + * #provider() provider} method. The first invocation of that method will locate | |
| 45 | + * the default provider as specified below. | |
| 46 | + * | |
| 47 | + * <p> All of the methods in this class are safe for use by multiple concurrent | |
| 48 | + * threads. </p> | |
| 49 | + * | |
| 50 | + * @since 1.7 | |
| 51 | + */ | |
| 52 | + | |
| 53 | +public abstract class AsynchronousChannelProvider { | |
| 54 | + private static Void checkPermission() { | |
| 55 | + SecurityManager sm = System.getSecurityManager(); | |
| 56 | + if (sm != null) | |
| 57 | + sm.checkPermission(new RuntimePermission("asynchronousChannelProvider")); | |
| 58 | + return null; | |
| 59 | + } | |
| 60 | + private AsynchronousChannelProvider(Void ignore) { } | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * Initializes a new instance of this class. | |
| 64 | + * | |
| 65 | + * @throws SecurityException | |
| 66 | + * If a security manager has been installed and it denies | |
| 67 | + * {@link RuntimePermission}<tt>("asynchronousChannelProvider")</tt> | |
| 68 | + */ | |
| 69 | + protected AsynchronousChannelProvider() { | |
| 70 | + this(checkPermission()); | |
| 71 | + } | |
| 72 | + | |
| 73 | + // lazy initialization of default provider | |
| 74 | + private static class ProviderHolder { | |
| 75 | + static final AsynchronousChannelProvider provider = load(); | |
| 76 | + | |
| 77 | + private static AsynchronousChannelProvider load() { | |
| 78 | + return AccessController | |
| 79 | + .doPrivileged(new PrivilegedAction<AsynchronousChannelProvider>() { | |
| 80 | + public AsynchronousChannelProvider run() { | |
| 81 | + AsynchronousChannelProvider p; | |
| 82 | + p = loadProviderFromProperty(); | |
| 83 | + if (p != null) | |
| 84 | + return p; | |
| 85 | + p = loadProviderAsService(); | |
| 86 | + if (p != null) | |
| 87 | + return p; | |
| 88 | + return sun.nio.ch.DefaultAsynchronousChannelProvider.create(); | |
| 89 | + }}); | |
| 90 | + } | |
| 91 | + | |
| 92 | + private static AsynchronousChannelProvider loadProviderFromProperty() { | |
| 93 | + String cn = System.getProperty("java.nio.channels.spi.AsynchronousChannelProvider"); | |
| 94 | + if (cn == null) | |
| 95 | + return null; | |
| 96 | + try { | |
| 97 | + Class<?> c = Class.forName(cn, true, | |
| 98 | + ClassLoader.getSystemClassLoader()); | |
| 99 | + return (AsynchronousChannelProvider)c.newInstance(); | |
| 100 | + } catch (ClassNotFoundException x) { | |
| 101 | + throw new ServiceConfigurationError(null, x); | |
| 102 | + } catch (IllegalAccessException x) { | |
| 103 | + throw new ServiceConfigurationError(null, x); | |
| 104 | + } catch (InstantiationException x) { | |
| 105 | + throw new ServiceConfigurationError(null, x); | |
| 106 | + } catch (SecurityException x) { | |
| 107 | + throw new ServiceConfigurationError(null, x); | |
| 108 | + } | |
| 109 | + } | |
| 110 | + | |
| 111 | + private static AsynchronousChannelProvider loadProviderAsService() { | |
| 112 | + ServiceLoader<AsynchronousChannelProvider> sl = | |
| 113 | + ServiceLoader.load(AsynchronousChannelProvider.class, | |
| 114 | + ClassLoader.getSystemClassLoader()); | |
| 115 | + Iterator<AsynchronousChannelProvider> i = sl.iterator(); | |
| 116 | + for (;;) { | |
| 117 | + try { | |
| 118 | + return (i.hasNext()) ? i.next() : null; | |
| 119 | + } catch (ServiceConfigurationError sce) { | |
| 120 | + if (sce.getCause() instanceof SecurityException) { | |
| 121 | + // Ignore the security exception, try the next provider | |
| 122 | + continue; | |
| 123 | + } | |
| 124 | + throw sce; | |
| 125 | + } | |
| 126 | + } | |
| 127 | + } | |
| 128 | + } | |
| 129 | + | |
| 130 | + /** | |
| 131 | + * Returns the system-wide default asynchronous channel provider for this | |
| 132 | + * invocation of the Java virtual machine. | |
| 133 | + * | |
| 134 | + * <p> The first invocation of this method locates the default provider | |
| 135 | + * object as follows: </p> | |
| 136 | + * | |
| 137 | + * <ol> | |
| 138 | + * | |
| 139 | + * <li><p> If the system property | |
| 140 | + * <tt>java.nio.channels.spi.AsynchronousChannelProvider</tt> is defined | |
| 141 | + * then it is taken to be the fully-qualified name of a concrete provider class. | |
| 142 | + * The class is loaded and instantiated; if this process fails then an | |
| 143 | + * unspecified error is thrown. </p></li> | |
| 144 | + * | |
| 145 | + * <li><p> If a provider class has been installed in a jar file that is | |
| 146 | + * visible to the system class loader, and that jar file contains a | |
| 147 | + * provider-configuration file named | |
| 148 | + * <tt>java.nio.channels.spi.AsynchronousChannelProvider</tt> in the resource | |
| 149 | + * directory <tt>META-INF/services</tt>, then the first class name | |
| 150 | + * specified in that file is taken. The class is loaded and | |
| 151 | + * instantiated; if this process fails then an unspecified error is | |
| 152 | + * thrown. </p></li> | |
| 153 | + * | |
| 154 | + * <li><p> Finally, if no provider has been specified by any of the above | |
| 155 | + * means then the system-default provider class is instantiated and the | |
| 156 | + * result is returned. </p></li> | |
| 157 | + * | |
| 158 | + * </ol> | |
| 159 | + * | |
| 160 | + * <p> Subsequent invocations of this method return the provider that was | |
| 161 | + * returned by the first invocation. </p> | |
| 162 | + * | |
| 163 | + * @return The system-wide default AsynchronousChannel provider | |
| 164 | + */ | |
| 165 | + public static AsynchronousChannelProvider provider() { | |
| 166 | + return ProviderHolder.provider; | |
| 167 | + } | |
| 168 | + | |
| 169 | + /** | |
| 170 | + * Constructs a new asynchronous channel group with a fixed thread pool. | |
| 171 | + * | |
| 172 | + * @param nThreads | |
| 173 | + * The number of threads in the pool | |
| 174 | + * @param threadFactory | |
| 175 | + * The factory to use when creating new threads | |
| 176 | + * | |
| 177 | + * @throws IllegalArgumentException | |
| 178 | + * If {@code nThreads <= 0} | |
| 179 | + * @throws IOException | |
| 180 | + * If an I/O error occurs | |
| 181 | + * | |
| 182 | + * @see AsynchronousChannelGroup#withFixedThreadPool | |
| 183 | + */ | |
| 184 | + public abstract AsynchronousChannelGroup | |
| 185 | + openAsynchronousChannelGroup(int nThreads, ThreadFactory threadFactory) throws IOException; | |
| 186 | + | |
| 187 | + /** | |
| 188 | + * Constructs a new asynchronous channel group with the given thread pool. | |
| 189 | + * | |
| 190 | + * @param executor | |
| 191 | + * The thread pool | |
| 192 | + * @param initialSize | |
| 193 | + * A value {@code >=0} or a negative value for implementation | |
| 194 | + * specific default | |
| 195 | + * | |
| 196 | + * @throws IOException | |
| 197 | + * If an I/O error occurs | |
| 198 | + * | |
| 199 | + * @see AsynchronousChannelGroup#withCachedThreadPool | |
| 200 | + */ | |
| 201 | + public abstract AsynchronousChannelGroup | |
| 202 | + openAsynchronousChannelGroup(ExecutorService executor, int initialSize) throws IOException; | |
| 203 | + | |
| 204 | + /** | |
| 205 | + * Opens an asynchronous server-socket channel. | |
| 206 | + * | |
| 207 | + * @param group | |
| 208 | + * The group to which the channel is bound, or {@code null} to | |
| 209 | + * bind to the default group | |
| 210 | + * | |
| 211 | + * @return The new channel | |
| 212 | + * | |
| 213 | + * @throws IllegalChannelGroupException | |
| 214 | + * If the provider that created the group differs from this provider | |
| 215 | + * @throws ShutdownChannelGroupException | |
| 216 | + * The group is shutdown | |
| 217 | + * @throws IOException | |
| 218 | + * If an I/O error occurs | |
| 219 | + */ | |
| 220 | + public abstract AsynchronousServerSocketChannel openAsynchronousServerSocketChannel | |
| 221 | + (AsynchronousChannelGroup group) throws IOException; | |
| 222 | + | |
| 223 | + /** | |
| 224 | + * Opens an asynchronous socket channel. | |
| 225 | + * | |
| 226 | + * @param group | |
| 227 | + * The group to which the channel is bound, or {@code null} to | |
| 228 | + * bind to the default group | |
| 229 | + * | |
| 230 | + * @return The new channel | |
| 231 | + * | |
| 232 | + * @throws IllegalChannelGroupException | |
| 233 | + * If the provider that created the group differs from this provider | |
| 234 | + * @throws ShutdownChannelGroupException | |
| 235 | + * The group is shutdown | |
| 236 | + * @throws IOException | |
| 237 | + * If an I/O error occurs | |
| 238 | + */ | |
| 239 | + public abstract AsynchronousSocketChannel openAsynchronousSocketChannel | |
| 240 | + (AsynchronousChannelGroup group) throws IOException; | |
| 241 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,302 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2009, 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.spi; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.net.ProtocolFamily; | |
| 30 | +import java.nio.channels.*; | |
| 31 | +import java.security.AccessController; | |
| 32 | +import java.security.PrivilegedAction; | |
| 33 | +import java.util.Iterator; | |
| 34 | +import java.util.ServiceLoader; | |
| 35 | +import java.util.ServiceConfigurationError; | |
| 36 | +import sun.security.action.GetPropertyAction; | |
| 37 | + | |
| 38 | + | |
| 39 | +/** | |
| 40 | + * Service-provider class for selectors and selectable channels. | |
| 41 | + * | |
| 42 | + * <p> A selector provider is a concrete subclass of this class that has a | |
| 43 | + * zero-argument constructor and implements the abstract methods specified | |
| 44 | + * below. A given invocation of the Java virtual machine maintains a single | |
| 45 | + * system-wide default provider instance, which is returned by the {@link | |
| 46 | + * #provider() provider} method. The first invocation of that method will locate | |
| 47 | + * the default provider as specified below. | |
| 48 | + * | |
| 49 | + * <p> The system-wide default provider is used by the static <tt>open</tt> | |
| 50 | + * methods of the {@link java.nio.channels.DatagramChannel#open | |
| 51 | + * DatagramChannel}, {@link java.nio.channels.Pipe#open Pipe}, {@link | |
| 52 | + * java.nio.channels.Selector#open Selector}, {@link | |
| 53 | + * java.nio.channels.ServerSocketChannel#open ServerSocketChannel}, and {@link | |
| 54 | + * java.nio.channels.SocketChannel#open SocketChannel} classes. It is also | |
| 55 | + * used by the {@link java.lang.System#inheritedChannel System.inheritedChannel()} | |
| 56 | + * method. A program may make use of a provider other than the default provider | |
| 57 | + * by instantiating that provider and then directly invoking the <tt>open</tt> | |
| 58 | + * methods defined in this class. | |
| 59 | + * | |
| 60 | + * <p> All of the methods in this class are safe for use by multiple concurrent | |
| 61 | + * threads. </p> | |
| 62 | + * | |
| 63 | + * | |
| 64 | + * @author Mark Reinhold | |
| 65 | + * @author JSR-51 Expert Group | |
| 66 | + * @since 1.4 | |
| 67 | + */ | |
| 68 | + | |
| 69 | +public abstract class SelectorProvider { | |
| 70 | + | |
| 71 | + private static final Object lock = new Object(); | |
| 72 | + private static SelectorProvider provider = null; | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Initializes a new instance of this class. </p> | |
| 76 | + * | |
| 77 | + * @throws SecurityException | |
| 78 | + * If a security manager has been installed and it denies | |
| 79 | + * {@link RuntimePermission}<tt>("selectorProvider")</tt> | |
| 80 | + */ | |
| 81 | + protected SelectorProvider() { | |
| 82 | + SecurityManager sm = System.getSecurityManager(); | |
| 83 | + if (sm != null) | |
| 84 | + sm.checkPermission(new RuntimePermission("selectorProvider")); | |
| 85 | + } | |
| 86 | + | |
| 87 | + private static boolean loadProviderFromProperty() { | |
| 88 | + String cn = System.getProperty("java.nio.channels.spi.SelectorProvider"); | |
| 89 | + if (cn == null) | |
| 90 | + return false; | |
| 91 | + try { | |
| 92 | + Class<?> c = Class.forName(cn, true, | |
| 93 | + ClassLoader.getSystemClassLoader()); | |
| 94 | + provider = (SelectorProvider)c.newInstance(); | |
| 95 | + return true; | |
| 96 | + } catch (ClassNotFoundException x) { | |
| 97 | + throw new ServiceConfigurationError(null, x); | |
| 98 | + } catch (IllegalAccessException x) { | |
| 99 | + throw new ServiceConfigurationError(null, x); | |
| 100 | + } catch (InstantiationException x) { | |
| 101 | + throw new ServiceConfigurationError(null, x); | |
| 102 | + } catch (SecurityException x) { | |
| 103 | + throw new ServiceConfigurationError(null, x); | |
| 104 | + } | |
| 105 | + } | |
| 106 | + | |
| 107 | + private static boolean loadProviderAsService() { | |
| 108 | + | |
| 109 | + ServiceLoader<SelectorProvider> sl = | |
| 110 | + ServiceLoader.load(SelectorProvider.class, | |
| 111 | + ClassLoader.getSystemClassLoader()); | |
| 112 | + Iterator<SelectorProvider> i = sl.iterator(); | |
| 113 | + for (;;) { | |
| 114 | + try { | |
| 115 | + if (!i.hasNext()) | |
| 116 | + return false; | |
| 117 | + provider = i.next(); | |
| 118 | + return true; | |
| 119 | + } catch (ServiceConfigurationError sce) { | |
| 120 | + if (sce.getCause() instanceof SecurityException) { | |
| 121 | + // Ignore the security exception, try the next provider | |
| 122 | + continue; | |
| 123 | + } | |
| 124 | + throw sce; | |
| 125 | + } | |
| 126 | + } | |
| 127 | + } | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * Returns the system-wide default selector provider for this invocation of | |
| 131 | + * the Java virtual machine. | |
| 132 | + * | |
| 133 | + * <p> The first invocation of this method locates the default provider | |
| 134 | + * object as follows: </p> | |
| 135 | + * | |
| 136 | + * <ol> | |
| 137 | + * | |
| 138 | + * <li><p> If the system property | |
| 139 | + * <tt>java.nio.channels.spi.SelectorProvider</tt> is defined then it is | |
| 140 | + * taken to be the fully-qualified name of a concrete provider class. | |
| 141 | + * The class is loaded and instantiated; if this process fails then an | |
| 142 | + * unspecified error is thrown. </p></li> | |
| 143 | + * | |
| 144 | + * <li><p> If a provider class has been installed in a jar file that is | |
| 145 | + * visible to the system class loader, and that jar file contains a | |
| 146 | + * provider-configuration file named | |
| 147 | + * <tt>java.nio.channels.spi.SelectorProvider</tt> in the resource | |
| 148 | + * directory <tt>META-INF/services</tt>, then the first class name | |
| 149 | + * specified in that file is taken. The class is loaded and | |
| 150 | + * instantiated; if this process fails then an unspecified error is | |
| 151 | + * thrown. </p></li> | |
| 152 | + * | |
| 153 | + * <li><p> Finally, if no provider has been specified by any of the above | |
| 154 | + * means then the system-default provider class is instantiated and the | |
| 155 | + * result is returned. </p></li> | |
| 156 | + * | |
| 157 | + * </ol> | |
| 158 | + * | |
| 159 | + * <p> Subsequent invocations of this method return the provider that was | |
| 160 | + * returned by the first invocation. </p> | |
| 161 | + * | |
| 162 | + * @return The system-wide default selector provider | |
| 163 | + */ | |
| 164 | + public static SelectorProvider provider() { | |
| 165 | + synchronized (lock) { | |
| 166 | + if (provider != null) | |
| 167 | + return provider; | |
| 168 | + return AccessController.doPrivileged( | |
| 169 | + new PrivilegedAction<SelectorProvider>() { | |
| 170 | + public SelectorProvider run() { | |
| 171 | + if (loadProviderFromProperty()) | |
| 172 | + return provider; | |
| 173 | + if (loadProviderAsService()) | |
| 174 | + return provider; | |
| 175 | + provider = sun.nio.ch.DefaultSelectorProvider.create(); | |
| 176 | + return provider; | |
| 177 | + } | |
| 178 | + }); | |
| 179 | + } | |
| 180 | + } | |
| 181 | + | |
| 182 | + /** | |
| 183 | + * Opens a datagram channel. </p> | |
| 184 | + * | |
| 185 | + * @return The new channel | |
| 186 | + */ | |
| 187 | + public abstract DatagramChannel openDatagramChannel() | |
| 188 | + throws IOException; | |
| 189 | + | |
| 190 | + /** | |
| 191 | + * Opens a datagram channel. | |
| 192 | + * | |
| 193 | + * @param family | |
| 194 | + * The protocol family | |
| 195 | + * | |
| 196 | + * @return A new datagram channel | |
| 197 | + * | |
| 198 | + * @throws UnsupportedOperationException | |
| 199 | + * If the specified protocol family is not supported | |
| 200 | + * @throws IOException | |
| 201 | + * If an I/O error occurs | |
| 202 | + * | |
| 203 | + * @since 1.7 | |
| 204 | + */ | |
| 205 | + public abstract DatagramChannel openDatagramChannel(ProtocolFamily family) | |
| 206 | + throws IOException; | |
| 207 | + | |
| 208 | + /** | |
| 209 | + * Opens a pipe. </p> | |
| 210 | + * | |
| 211 | + * @return The new pipe | |
| 212 | + */ | |
| 213 | + public abstract Pipe openPipe() | |
| 214 | + throws IOException; | |
| 215 | + | |
| 216 | + /** | |
| 217 | + * Opens a selector. </p> | |
| 218 | + * | |
| 219 | + * @return The new selector | |
| 220 | + */ | |
| 221 | + public abstract AbstractSelector openSelector() | |
| 222 | + throws IOException; | |
| 223 | + | |
| 224 | + /** | |
| 225 | + * Opens a server-socket channel. </p> | |
| 226 | + * | |
| 227 | + * @return The new channel | |
| 228 | + */ | |
| 229 | + public abstract ServerSocketChannel openServerSocketChannel() | |
| 230 | + throws IOException; | |
| 231 | + | |
| 232 | + /** | |
| 233 | + * Opens a socket channel. </p> | |
| 234 | + * | |
| 235 | + * @return The new channel | |
| 236 | + */ | |
| 237 | + public abstract SocketChannel openSocketChannel() | |
| 238 | + throws IOException; | |
| 239 | + | |
| 240 | + /** | |
| 241 | + * Returns the channel inherited from the entity that created this | |
| 242 | + * Java virtual machine. | |
| 243 | + * | |
| 244 | + * <p> On many operating systems a process, such as a Java virtual | |
| 245 | + * machine, can be started in a manner that allows the process to | |
| 246 | + * inherit a channel from the entity that created the process. The | |
| 247 | + * manner in which this is done is system dependent, as are the | |
| 248 | + * possible entities to which the channel may be connected. For example, | |
| 249 | + * on UNIX systems, the Internet services daemon (<i>inetd</i>) is used to | |
| 250 | + * start programs to service requests when a request arrives on an | |
| 251 | + * associated network port. In this example, the process that is started, | |
| 252 | + * inherits a channel representing a network socket. | |
| 253 | + * | |
| 254 | + * <p> In cases where the inherited channel represents a network socket | |
| 255 | + * then the {@link java.nio.channels.Channel Channel} type returned | |
| 256 | + * by this method is determined as follows: | |
| 257 | + * | |
| 258 | + * <ul> | |
| 259 | + * | |
| 260 | + * <li><p> If the inherited channel represents a stream-oriented connected | |
| 261 | + * socket then a {@link java.nio.channels.SocketChannel SocketChannel} is | |
| 262 | + * returned. The socket channel is, at least initially, in blocking | |
| 263 | + * mode, bound to a socket address, and connected to a peer. | |
| 264 | + * </p></li> | |
| 265 | + * | |
| 266 | + * <li><p> If the inherited channel represents a stream-oriented listening | |
| 267 | + * socket then a {@link java.nio.channels.ServerSocketChannel | |
| 268 | + * ServerSocketChannel} is returned. The server-socket channel is, at | |
| 269 | + * least initially, in blocking mode, and bound to a socket address. | |
| 270 | + * </p></li> | |
| 271 | + * | |
| 272 | + * <li><p> If the inherited channel is a datagram-oriented socket | |
| 273 | + * then a {@link java.nio.channels.DatagramChannel DatagramChannel} is | |
| 274 | + * returned. The datagram channel is, at least initially, in blocking | |
| 275 | + * mode, and bound to a socket address. | |
| 276 | + * </p></li> | |
| 277 | + * | |
| 278 | + * </ul> | |
| 279 | + * | |
| 280 | + * <p> In addition to the network-oriented channels described, this method | |
| 281 | + * may return other kinds of channels in the future. | |
| 282 | + * | |
| 283 | + * <p> The first invocation of this method creates the channel that is | |
| 284 | + * returned. Subsequent invocations of this method return the same | |
| 285 | + * channel. </p> | |
| 286 | + * | |
| 287 | + * @return The inherited channel, if any, otherwise <tt>null</tt>. | |
| 288 | + * | |
| 289 | + * @throws IOException | |
| 290 | + * If an I/O error occurs | |
| 291 | + * | |
| 292 | + * @throws SecurityException | |
| 293 | + * If a security manager has been installed and it denies | |
| 294 | + * {@link RuntimePermission}<tt>("inheritedChannel")</tt> | |
| 295 | + * | |
| 296 | + * @since 1.5 | |
| 297 | + */ | |
| 298 | + public Channel inheritedChannel() throws IOException { | |
| 299 | + return null; | |
| 300 | + } | |
| 301 | + | |
| 302 | +} | |
| @@ -0,0 +1,13 @@ | ||
| 1 | +<../../../../../../mkconfig | |
| 2 | + | |
| 3 | +TARG=\ | |
| 4 | + AbstractInterruptibleChannel.dis\ | |
| 5 | + AbstractSelectableChannel.dis\ | |
| 6 | + AbstractSelectionKey.dis\ | |
| 7 | + AbstractSelector.dis\ | |
| 8 | + AsynchronousChannelProvider.dis\ | |
| 9 | + SelectorProvider.dis\ | |
| 10 | + | |
| 11 | +DISBIN=$ROOT/java/dis/java/java/java/nio/channels/spi | |
| 12 | + | |
| 13 | +<$ROOT/mkfiles/mkjava | |
| @@ -0,0 +1,45 @@ | ||
| 1 | +<!-- | |
| 2 | + Copyright (c) 2000, 2009, 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 | +<!doctype html public "-//IETF//DTD HTML//EN"> | |
| 27 | +<html> | |
| 28 | +<body bgcolor="white"> | |
| 29 | + | |
| 30 | +Service-provider classes for the <tt>{@link java.nio.channels}</tt> package. | |
| 31 | + | |
| 32 | +<p> Only developers who are defining new selector providers or asynchronous | |
| 33 | +channel providers should need to make direct use of this package. </p> | |
| 34 | + | |
| 35 | +<p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor | |
| 36 | +or method in any class or interface in this package will cause a {@link | |
| 37 | +java.lang.NullPointerException NullPointerException} to be thrown. | |
| 38 | + | |
| 39 | + | |
| 40 | +@since 1.4 | |
| 41 | +@author Mark Reinhold | |
| 42 | +@author JSR-51 Expert Group | |
| 43 | + | |
| 44 | +</body> | |
| 45 | +</html> | |