/* * Copyright 2007-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package java.nio.channels; import java.nio.ByteBuffer; import java.util.concurrent.Future; /** * An asynchronous channel that can read and write bytes. * *

Some channels may not allow more than one read or write to be outstanding * at any given time. If a thread invokes a read method before a previous read * operation has completed then a {@link ReadPendingException} will be thrown. * Similarly, if a write method is invoked before a previous write has completed * then {@link WritePendingException} is thrown. Whether or not other kinds of * I/O operations may proceed concurrently with a read operation depends upon * the type of the channel. * *

Note that {@link java.nio.ByteBuffer ByteBuffers} are not safe for use by * multiple concurrent threads. When a read or write operation is initiated then * care must be taken to ensure that the buffer is not accessed until the * operation completes. * * @see Channels#newInputStream(AsynchronousByteChannel) * @see Channels#newOutputStream(AsynchronousByteChannel) * * @since 1.7 */ public interface AsynchronousByteChannel extends AsynchronousChannel { /** * Reads a sequence of bytes from this channel into the given buffer. * *

This method initiates an operation to read a sequence of bytes from * this channel into the given buffer. The method returns a {@link Future} * representing the pending result of the operation. The result of the * operation, obtained by invoking the {@code Future} 's {@link * Future#get() get} method, is the number of bytes read or {@code -1} if * all bytes have been read and the channel has reached end-of-stream. * *

This method initiates a read operation to read up to r bytes * from the channel, where r is the number of bytes remaining in the * buffer, that is, {@code dst.remaining()} at the time that the read is * attempted. Where r is 0, the read operation completes immediately * with a result of {@code 0} without initiating an I/O operation. * *

Suppose that a byte sequence of length n is read, where * 0 < n <= r. * This byte sequence will be transferred into the buffer so that the first * byte in the sequence is at index p and the last byte is at index * p + n - 1, * where p is the buffer's position at the moment the read is * performed. Upon completion the buffer's position will be equal to * p + n; its limit will not have changed. * *

Buffers are not safe for use by multiple concurrent threads so care * should be taken to not to access the buffer until the operaton has completed. * *

This method may be invoked at any time. Some channel types may not * allow more than one read to be outstanding at any given time. If a thread * initiates a read operation before a previous read operation has * completed then a {@link ReadPendingException} will be thrown. * *

The handler parameter is used to specify a {@link * CompletionHandler}. When the read operation completes the handler's * {@link CompletionHandler#completed completed} method is executed. * * * @param dst * The buffer into which bytes are to be transferred * @param attachment * The object to attach to the I/O operation; can be {@code null} * @param handler * The completion handler object; can be {@code null} * * @return A Future representing the result of the operation * * @throws IllegalArgumentException * If the buffer is read-only * @throws ReadPendingException * If the channel does not allow more than one read to be outstanding * and a previous read has not completed */ Future read(ByteBuffer dst, A attachment, CompletionHandler handler); /** * Reads a sequence of bytes from this channel into the given buffer. * *

An invocation of this method of the form c.read(dst) * behaves in exactly the same manner as the invocation *

     * c.read(dst, null, null);
* * @param dst * The buffer into which bytes are to be transferred * * @return A Future representing the result of the operation * * @throws IllegalArgumentException * If the buffer is read-only * @throws ReadPendingException * If the channel does not allow more than one read to be outstanding * and a previous read has not completed */ Future read(ByteBuffer dst); /** * Writes a sequence of bytes to this channel from the given buffer. * *

This method initiates an operation to write a sequence of bytes to * this channel from the given buffer. This method returns a {@link * Future} representing the pending result of the operation. The result * of the operation, obtained by invoking the Future's {@link * Future#get() get} method, is the number of bytes written, possibly zero. * *

This method initiates a write operation to write up to r bytes * to the channel, where r is the number of bytes remaining in the * buffer, that is, {@code src.remaining()} at the moment the write is * attempted. Where r is 0, the write operation completes immediately * with a result of {@code 0} without initiating an I/O operation. * *

Suppose that a byte sequence of length n is written, where * 0 < n <= r. * This byte sequence will be transferred from the buffer starting at index * p, where p is the buffer's position at the moment the * write is performed; the index of the last byte written will be * p + n - 1. * Upon completion the buffer's position will be equal to * p + n; its limit will not have changed. * *

Buffers are not safe for use by multiple concurrent threads so care * should be taken to not to access the buffer until the operaton has completed. * *

This method may be invoked at any time. Some channel types may not * allow more than one write to be outstanding at any given time. If a thread * initiates a write operation before a previous write operation has * completed then a {@link WritePendingException} will be thrown. * *

The handler parameter is used to specify a {@link * CompletionHandler}. When the write operation completes the handler's * {@link CompletionHandler#completed completed} method is executed. * * @param src * The buffer from which bytes are to be retrieved * @param attachment * The object to attach to the I/O operation; can be {@code null} * @param handler * The completion handler object; can be {@code null} * * @return A Future representing the result of the operation * * @throws WritePendingException * If the channel does not allow more than one write to be outstanding * and a previous write has not completed */ Future write(ByteBuffer src, A attachment, CompletionHandler handler); /** * Writes a sequence of bytes to this channel from the given buffer. * *

An invocation of this method of the form c.write(src) * behaves in exactly the same manner as the invocation *

     * c.write(src, null, null);
* * @param src * The buffer from which bytes are to be retrieved * * @return A Future representing the result of the operation * * @throws WritePendingException * If the channel does not allow more than one write to be outstanding * and a previous write has not completed */ Future write(ByteBuffer src); }