History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/nio/channels/AsynchronousSocketChannel.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/nio/channels/AsynchronousSocketChannel.java+648−0
@@ -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>&nbsp;<tt>&lt;</tt>&nbsp;<i>n</i>&nbsp;<tt>&lt;=</tt>&nbsp;<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>&nbsp;<tt>&lt;</tt>&nbsp;<i>n</i>&nbsp;<tt>&lt;=</tt>&nbsp;<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+}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t