2003-05-02 Michael Koch <konqueror@gmx.de>
* gnu/java/nio/FileChannelImpl.java (read): New implementation. (implRead): New methods. (write): New implementation, call other write insteal of read method. (implWrite): New methods. (map): Added comment. (transferFrom): Implemented. (transferTo): Implemented. (lock): Added checks to throw exceptions. (truncate): Added check to throw exception. * gnu/java/nio/natFileChannelImpl.cc (implRead): New method. (implWrite): New method. * java/nio/ByteBuffer.java (hashCode): Fixed comment. (get): Fixed exception documentation. (put): Fixed exception documentation. * java/nio/CharBuffer.java: Added comment for later optimizations. From-SVN: r66373
This commit is contained in:
parent
c67528fe19
commit
4b6eac52d5
5 changed files with 131 additions and 43 deletions
|
@ -126,19 +126,15 @@ public class FileChannelImpl extends FileChannel
|
|||
|
||||
public int read (ByteBuffer dst) throws IOException
|
||||
{
|
||||
int s = (int)size();
|
||||
|
||||
if (buf == null)
|
||||
// Check if file is mapped into memory.
|
||||
if (buf != null)
|
||||
{
|
||||
throw new EOFException("file not mapped");
|
||||
// FIXME: implement this
|
||||
throw new Error ("Accessing mapped buffers not implemented.");
|
||||
}
|
||||
|
||||
for (int i = 0; i < s; i++)
|
||||
{
|
||||
dst.put (buf.get());
|
||||
}
|
||||
|
||||
return s;
|
||||
// File not mapped, access it directly.
|
||||
return implRead (dst);
|
||||
}
|
||||
|
||||
public int read (ByteBuffer dst, long position)
|
||||
|
@ -149,12 +145,34 @@ public class FileChannelImpl extends FileChannel
|
|||
|
||||
if (!isOpen ())
|
||||
throw new ClosedChannelException ();
|
||||
|
||||
// FIXME: check for NonReadableChannelException
|
||||
|
||||
if (file_obj instanceof FileOutputStream)
|
||||
throw new NonReadableChannelException ();
|
||||
|
||||
throw new Error ("Not implemented");
|
||||
int result;
|
||||
long oldPosition;
|
||||
|
||||
oldPosition = implPosition ();
|
||||
result = implRead (dst);
|
||||
implPosition (oldPosition);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private int implRead (ByteBuffer dst) throws IOException
|
||||
{
|
||||
int result;
|
||||
byte[] buffer = new byte [dst.remaining ()];
|
||||
|
||||
result = implRead (buffer, 0, buffer.length);
|
||||
dst.put (buffer, 0, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private native int implRead (byte[] buffer, int offset, int length)
|
||||
throws IOException;
|
||||
|
||||
public long read (ByteBuffer[] dsts, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
|
@ -162,7 +180,7 @@ public class FileChannelImpl extends FileChannel
|
|||
|
||||
for (int i = offset; i < offset + length; i++)
|
||||
{
|
||||
result += write (dsts [i]);
|
||||
result += read (dsts [i]);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -170,20 +188,15 @@ public class FileChannelImpl extends FileChannel
|
|||
|
||||
public int write (ByteBuffer src) throws IOException
|
||||
{
|
||||
int w = 0;
|
||||
|
||||
if (buf == null)
|
||||
// Check if file is mapped into memory.
|
||||
if (buf != null)
|
||||
{
|
||||
throw new EOFException ("file not mapped");
|
||||
// FIXME: implement this
|
||||
throw new Error ("Accessing mapped buffers not implemented.");
|
||||
}
|
||||
|
||||
while (src.hasRemaining ())
|
||||
{
|
||||
buf.put (src.get ());
|
||||
w++;
|
||||
}
|
||||
|
||||
return w;
|
||||
|
||||
// File not mapped, access it directly.
|
||||
return implWrite (src);
|
||||
}
|
||||
|
||||
public int write (ByteBuffer src, long position)
|
||||
|
@ -195,10 +208,29 @@ public class FileChannelImpl extends FileChannel
|
|||
if (!isOpen ())
|
||||
throw new ClosedChannelException ();
|
||||
|
||||
// FIXME: check for NonWritableChannelException
|
||||
if (file_obj instanceof FileInputStream)
|
||||
throw new NonWritableChannelException ();
|
||||
|
||||
throw new Error ("Not implemented");
|
||||
int result;
|
||||
long oldPosition;
|
||||
|
||||
oldPosition = implPosition ();
|
||||
result = implWrite (src);
|
||||
implPosition (oldPosition);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private int implWrite (ByteBuffer src) throws IOException
|
||||
{
|
||||
byte[] buffer = new byte [src.remaining ()];
|
||||
|
||||
src.get (buffer, 0, buffer.length);
|
||||
return implWrite (buffer, 0, buffer.length);
|
||||
}
|
||||
|
||||
private native int implWrite (byte[] buffer, int offset, int length)
|
||||
throws IOException;
|
||||
|
||||
public long write(ByteBuffer[] srcs, int offset, int length)
|
||||
throws IOException
|
||||
|
@ -225,6 +257,7 @@ public class FileChannelImpl extends FileChannel
|
|||
|| size > Integer.MAX_VALUE)
|
||||
throw new IllegalArgumentException ();
|
||||
|
||||
// FIXME: Make this working.
|
||||
int cmode = mode.m;
|
||||
map_address = nio_mmap_file (position, size, cmode);
|
||||
length = (int) size;
|
||||
|
@ -272,10 +305,13 @@ public class FileChannelImpl extends FileChannel
|
|||
if (!isOpen ())
|
||||
throw new ClosedChannelException ();
|
||||
|
||||
// FIXME: check for NonReadableChannelException
|
||||
// FIXME: check for NonWritableChannelException
|
||||
|
||||
throw new Error ("Not implemented");
|
||||
if (file_obj instanceof FileOutputStream)
|
||||
throw new NonReadableChannelException ();
|
||||
|
||||
// XXX: count needs to be casted from long to int. Dataloss ?
|
||||
ByteBuffer buffer = ByteBuffer.allocate ((int) count);
|
||||
read (buffer, position);
|
||||
return target.write (buffer);
|
||||
}
|
||||
|
||||
public long transferFrom (ReadableByteChannel src, long position, long count)
|
||||
|
@ -288,10 +324,13 @@ public class FileChannelImpl extends FileChannel
|
|||
if (!isOpen ())
|
||||
throw new ClosedChannelException ();
|
||||
|
||||
// FIXME: check for NonReadableChannelException
|
||||
// FIXME: check for NonWritableChannelException
|
||||
|
||||
throw new Error ("Not implemented");
|
||||
if (file_obj instanceof FileInputStream)
|
||||
throw new NonWritableChannelException ();
|
||||
|
||||
// XXX: count needs to be casted from long to int. Dataloss ?
|
||||
ByteBuffer buffer = ByteBuffer.allocate ((int) count);
|
||||
src.read (buffer);
|
||||
return write (buffer, position);
|
||||
}
|
||||
|
||||
public FileLock lock (long position, long size, boolean shared)
|
||||
|
@ -304,9 +343,14 @@ public class FileChannelImpl extends FileChannel
|
|||
if (!isOpen ())
|
||||
throw new ClosedChannelException ();
|
||||
|
||||
// FIXME: check for NonReadableChannelException
|
||||
// FIXME: check for NonWritableChannelException
|
||||
|
||||
if (shared &&
|
||||
file_obj instanceof FileOutputStream)
|
||||
throw new NonReadableChannelException ();
|
||||
|
||||
if (!shared &&
|
||||
file_obj instanceof FileInputStream)
|
||||
throw new NonWritableChannelException ();
|
||||
|
||||
throw new Error ("Not implemented");
|
||||
}
|
||||
|
||||
|
@ -353,7 +397,8 @@ public class FileChannelImpl extends FileChannel
|
|||
if (!isOpen ())
|
||||
throw new ClosedChannelException ();
|
||||
|
||||
// FIXME: check for NonWritableChannelException
|
||||
if (file_obj instanceof FileInputStream)
|
||||
throw new NonWritableChannelException ();
|
||||
|
||||
return implTruncate (size);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue