diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 375f109b6fc..b3e347fde2e 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,17 @@ +2004-07-17 Mark Wielaard + + * gnu/java/nio/channels/FileChannelImpl.java (truncate): Only truncate + when size is smaller. + * java/io/RandomAccessFile.java (setLength): Use truncate for + shrinking the file and seek plus write for expanding the file. + +2004-07-17 Michael Koch + + * gnu/java/nio/channels/natFileChannelPosix.cc + (implTruncate): Always save current position. Only reposition file + pointer to where we started if not beyond new lenght. Reposition file + pointer to file length if it points beyond the end of file. + 2004-07-17 Mark Wielaard * javax/swing/Box.java: Put FIXME comment above class declaration. diff --git a/libjava/gnu/java/nio/channels/FileChannelImpl.java b/libjava/gnu/java/nio/channels/FileChannelImpl.java index 8b3d0fc86b3..678e10f2349 100644 --- a/libjava/gnu/java/nio/channels/FileChannelImpl.java +++ b/libjava/gnu/java/nio/channels/FileChannelImpl.java @@ -422,7 +422,9 @@ public final class FileChannelImpl extends FileChannel if ((mode & WRITE) == 0) throw new NonWritableChannelException (); - implTruncate (size); + if (size < size ()) + implTruncate (size); + return this; } } diff --git a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc index b8f99378834..a2c1c7962b0 100644 --- a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc +++ b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc @@ -274,7 +274,10 @@ FileChannelImpl::implTruncate (jlong size) } else { - if (::ftruncate (fd, (off_t) pos)) + if (::ftruncate (fd, (off_t) size)) + throw new IOException (JvNewStringLatin1 (strerror (errno))); + if (pos > size + && ::lseek (fd, (off_t) size, SEEK_SET) == -1) throw new IOException (JvNewStringLatin1 (strerror (errno))); pos = size; } diff --git a/libjava/java/io/RandomAccessFile.java b/libjava/java/io/RandomAccessFile.java index c20549c12df..7907d46f2fd 100644 --- a/libjava/java/io/RandomAccessFile.java +++ b/libjava/java/io/RandomAccessFile.java @@ -194,12 +194,14 @@ public class RandomAccessFile implements DataOutput, DataInput } /** - * This method sets the length of the file to the specified length. If - * the currently length of the file is longer than the specified length, - * then the file is truncated to the specified length. If the current - * length of the file is shorter than the specified length, the file - * is extended with bytes of an undefined value. - *

+ * This method sets the length of the file to the specified length. + * If the currently length of the file is longer than the specified + * length, then the file is truncated to the specified length (the + * file position is set to the end of file in this case). If the + * current length of the file is shorter than the specified length, + * the file is extended with bytes of an undefined value (the file + * position is unchanged in this case). + *

* The file must be open for write access for this operation to succeed. * * @param newlen The new length of the file @@ -208,7 +210,19 @@ public class RandomAccessFile implements DataOutput, DataInput */ public void setLength (long newLen) throws IOException { - ch.truncate (newLen); + // FIXME: Extending a file should probably be done by one method call. + + // FileChannel.truncate() can only shrink a file. + // To expand it we need to seek forward and write at least one byte. + if (newLen < length()) + ch.truncate (newLen); + else if (newLen > length()) + { + long pos = getFilePointer(); + seek(newLen - 1); + write(0); + seek(pos); + } } /**