From 69c107efe49360359ac10ab2172fafaf0a665deb Mon Sep 17 00:00:00 2001 From: Michael Koch Date: Tue, 18 Feb 2003 07:26:20 +0000 Subject: 2003-02-18 Michael Koch * java/nio/channels/FileChannel.java (toString): New implementation, added documentation. (map): Added exception documentation. (size): Added exception documentation. (write): New methods, documentation work. (read): New methods, documentation work. (implCloseChannel): Rewrote exception documentation. (force): Throws IOException, added documentation. (lock): New methods. (tryLock): New methods. (position): New methods. (transferTo): New method. (transferFrom): New method. (truncate): New method. * java/nio/channels/spi/SelectorProvider.java (provider): Implemented. * Makefile.am (ordinary_java_source_files): Added the following files: gnu/java/nio/DatagramChannelImpl.java gnu/java/nio/FileChannelImpl.java gnu/java/nio/PipeImpl.java gnu/java/nio/SelectionKeyImpl.java gnu/java/nio/SelectorImpl.java gnu/java/nio/SelectorProviderImpl.java gnu/java/nio/ServerSocketChannelImpl.java gnu/java/nio/SocketChannelImpl.java java/nio/channels/FileLock.java (nat_java_source_files): Added the following files: gnu/java/nio/natFileChannelImpl.cc gnu/java/nio/natSelectorImpl.cc gnu/java/nio/natSocketChannelImpl.cc * Makefile.in: Regenerated. From-SVN: r63028 --- libjava/java/nio/channels/FileChannel.java | 243 ++++++++++++++++++++- .../java/nio/channels/spi/SelectorProvider.java | 8 +- 2 files changed, 243 insertions(+), 8 deletions(-) (limited to 'libjava/java') diff --git a/libjava/java/nio/channels/FileChannel.java b/libjava/java/nio/channels/FileChannel.java index 8970b98..3fa0f35 100644 --- a/libjava/java/nio/channels/FileChannel.java +++ b/libjava/java/nio/channels/FileChannel.java @@ -65,9 +65,17 @@ public abstract class FileChannel extends AbstractInterruptibleChannel m = a; } + /** + * Returns a string representation of the MapMode object. + */ public String toString() { - return "" + m; + if (this == READ_ONLY) + return "READ_ONLY"; + else if (this == READ_WRITE) + return "READ_WRITE"; + + return "PRIVATE"; } } @@ -81,20 +89,28 @@ public abstract class FileChannel extends AbstractInterruptibleChannel /** * Maps the file into the memory. * - * @exception IOException If an error occurs. + * @exception IllegalArgumentException If the preconditions on the parameters + * do not hold. + * @exception IOException If an I/O error occurs. + * @exception NonReadableChannelException If mode is READ_ONLY but this channel was + * not opened for reading. + * @exception NonWritableChannelException If mode is READ_WRITE or PRIVATE but this + * channel was not opened for writing. */ public abstract MappedByteBuffer map(MapMode mode, long position, long size) throws IOException; /** * Return the size of the file thus far + * + * @exception ClosedChannelException If this channel is closed. */ public abstract long size() throws IOException; /** * Writes data to the channel. * - * @exception IOException If an error occurs. + * @exception IOException If an I/O error occurs. */ public long write (ByteBuffer[] srcs) throws IOException { @@ -110,26 +126,243 @@ public abstract class FileChannel extends AbstractInterruptibleChannel /** * Writes data to the channel. + * + * @exception IOException If an I/O error occurs. + */ + public abstract int write (ByteBuffer src) throws IOException; + + /** + * Writes data to the channel. + * + * @exception AsynchronousCloseException If another thread closes this channel + * while the transfer is in progress. + * @exception ClosedByInterruptException If another thread interrupts the + * current thread while the transfer is in progress, thereby closing both + * channels and setting the current thread's interrupt status. + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If position is negative. + * @exception IOException If an I/O error occurs. + * @exception NonWritableChannelException If this channel was not opened for + * writing. + */ + public abstract int write (ByteBuffer srcs, long position) throws IOException; + + /** + * Writes data to the channel. + * + * @exception IOException If an I/O error occurs. */ public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException; /** * Reads data from the channel. + * + * @exception IOException If an I/O error occurs. + */ + public abstract long read (ByteBuffer[] dsts, int offset, int length) + throws IOException; + + /** + * Reads data from the channel. + * + * @exception IOException If an I/O error occurs. + */ + public final long read (ByteBuffer[] dsts) throws IOException + { + long result = 0; + + for (int i = 0; i < dsts.length; i++) + { + read (dsts [i]); + } + + return result; + } + + /** + * Reads data from the channel. + * + * @exception IOException If an I/O error occurs. */ public abstract int read(ByteBuffer dst) throws IOException; /** + * Reads data from the channel. + * + * @exception AsynchronousCloseException If another thread closes this channel + * while the transfer is in progress. + * @exception ClosedByInterruptException If another thread interrupts the + * current thread while the transfer is in progress, thereby closing both + * channels and setting the current thread's interrupt status. + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If position is negative. + * @exception IOException If an I/O error occurs. + * @exception NonReadableChannelException If this channel was not opened for + * reading. + */ + public abstract int read(ByteBuffer dst, long position) throws IOException; + + /** * Closes the channel. * * This is called from @see close. * - * @exception IOException If an error occurs. + * @exception IOException If an I/O error occurs. */ protected abstract void implCloseChannel() throws IOException; /** * msync with the disk + * + * @exception ClosedChannelException If this channel is closed. + * @exception IOException If an I/O error occurs. + */ + public abstract void force(boolean metaData) throws IOException; + + /** + * Creates a file lock for the whole assoziated file. + * + * @exception AsynchronousCloseException If another thread closes this channel + * while the transfer is in progress. + * @exception ClosedChannelException If this channel is closed. + * @exception FileLockInterruptionException If the invoking thread is + * interrupted while blocked in this method. + * @exception IOException If an I/O error occurs. + * @exception NonReadableChannelException If shared is true and this channel + * was not opened for reading. + * @exception NonWritableChannelException If shared is false and this channel + * was not opened for writing. + * @exception OverlappingFileLockException If a lock that overlaps the + * requested region is already held by this Java virtual machine, or if + * another thread is already blocked in this method and is attempting to lock + * an overlapping region. + */ + public final FileLock lock () throws IOException + { + return lock (0, Long.MAX_VALUE, false); + } + + /** + * Creates a file lock for a region of the assoziated file. + * + * @exception AsynchronousCloseException If another thread closes this channel + * while the transfer is in progress. + * @exception ClosedChannelException If this channel is closed. + * @exception FileLockInterruptionException If the invoking thread is + * interrupted while blocked in this method. + * @exception IllegalArgumentException If the preconditions on the parameters + * do not hold. + * @exception IOException If an I/O error occurs. + * @exception OverlappingFileLockException If a lock that overlaps the + * requested region is already held by this Java virtual machine, or if + * another thread is already blocked in this method and is attempting to lock + * an overlapping region. + * @exception NonReadableChannelException If shared is true and this channel + * was not opened for reading. + * @exception NonWritableChannelException If shared is false and this channel + * was not opened for writing. + */ + public abstract FileLock lock (long position, long size, boolean shared) + throws IOException; + + /** + * Tries to aqquire alock on the whole assoziated file. + * + * @exception ClosedChannelException If this channel is closed. + * @exception IOException If an I/O error occurs. + * @exception OverlappingFileLockException If a lock that overlaps the + * requested region is already held by this Java virtual machine, or if + * another thread is already blocked in this method and is attempting to lock + * an overlapping region. + */ + public final FileLock tryLock () throws IOException + { + return tryLock (0, Long.MAX_VALUE, false); + } + + /** + * Tries to aqquire a lock on a region of the assoziated file. + * + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If the preconditions on the parameters + * do not hold. + * @exception IOException If an I/O error occurs. + * @exception OverlappingFileLockException If a lock that overlaps the + * requested region is already held by this Java virtual machine, or if + * another thread is already blocked in this method and is attempting to lock + * an overlapping region. + */ + public abstract FileLock tryLock (long position, long size, boolean shared) + throws IOException; + + /** + * Returns the current position on the file. + * + * @exception ClosedChannelException If this channel is closed. + * @exception IOException If an I/O error occurs. + */ + public abstract long position () throws IOException; + + /** + * Sets the position of the channel on the assoziated file. + * + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If newPosition is negative. + * @exception IOException If an I/O error occurs. + */ + public abstract FileChannel position (long newPosition) throws IOException; + + /** + * Transfers bytes from this channel's file to the given writable byte + * channel. + * + * @exception AsynchronousCloseException If another thread closes this channel + * while the transfer is in progress. + * @exception ClosedByInterruptException If another thread interrupts the + * current thread while the transfer is in progress, thereby closing both + * channels and setting the current thread's interrupt status. + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If the preconditions on the parameters + * do not hold. + * @exception IOException If an I/O error occurs. + * @exception NonReadableChannelException If this channel was not opened for + * reading. + * @exception NonWritableChannelException If the target channel was not + * opened for writing. + */ + public abstract long transferTo (long position, long count, + WritableByteChannel target) + throws IOException; + + /** + * Transfers bytes from the given readable channel into this channel. + * + * @exception AsynchronousCloseException If another thread closes this channel + * while the transfer is in progress. + * @exception ClosedByInterruptException If another thread interrupts the + * current thread while the transfer is in progress, thereby closing both + * channels and setting the current thread's interrupt status. + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If the preconditions on the parameters + * do not hold. + * @exception IOException If an I/O error occurs. + * @exception NonReadableChannelException If the source channel was not + * opened for reading. + * @exception NonWritableChannelException If this channel was not opened for + * writing. + */ + public abstract long transferFrom (ReadableByteChannel src, long position, + long count) throws IOException; + + /** + * Truncates the channel's file at size. + * + * @exception ClosedChannelException If this channel is closed. + * @exception IllegalArgumentException If size is negative. + * @exception IOException If an I/O error occurs. + * @exception NonWritableChannelException If this channel was not opened for + * writing. */ - public abstract void force(boolean metaData); + public abstract FileChannel truncate (long size) throws IOException; } diff --git a/libjava/java/nio/channels/spi/SelectorProvider.java b/libjava/java/nio/channels/spi/SelectorProvider.java index 157a341..1d4ccfa 100644 --- a/libjava/java/nio/channels/spi/SelectorProvider.java +++ b/libjava/java/nio/channels/spi/SelectorProvider.java @@ -37,7 +37,7 @@ exception statement from your version. */ package java.nio.channels.spi; -/* import gnu.java.nio.channels.SelectorProviderImpl; */ +import gnu.java.nio.SelectorProviderImpl; import java.io.IOException; import java.nio.channels.DatagramChannel; import java.nio.channels.Pipe; @@ -97,8 +97,10 @@ public abstract class SelectorProvider */ public static SelectorProvider provider () { -/* if (pr == null) */ -/* pr = new SelectorProviderImpl (); */ + if (pr == null) + { + pr = new SelectorProviderImpl (); + } return pr; } -- cgit v1.1