Re: return to the begin of InputStream
On Thu, 10 Dec 2009 18:13:48 +0000, Tom Anderson wrote:
Now, i have been assuming that writing to a mapped file which *does*
live on disk affects the timestamp. Here is a test:
.......
In other words, writing to a mmapped file doesn't change the mtime.
Yikes!
Something about this niggled me - the effect of using coarse
(millisecond) time resolution and a fast (1.6 GHz) CPU when checking
the effect of single statements, so I rewrote your program to add 1000 mS
pauses between interesting groups of statements.
This shows that, on a Linux system anyway, the modification timestamp is
updated when a RandomAccessFile is written or a MappedByteBuffer is
changed. No other operations on an existing file including flushing its
buffers (FileDescriptor.sync() and MappedByteBuffer.force()) affect the
amended timestamp.
Here are the labelled timestamps:
$ java MMapTest
1 Create,open raf : = 1260562842000
2 Write : = 1260562843000
3 Sync : = 1260562843000
4 Mapped,put : = 1260562845000
5 Force : = 1260562845000
6 Close : = 1260562845000
7 Reopen raf : = 1260562845000
File content : = Mapd file
8 Read : = 1260562845000
9 Close : = 1260562845000
and here's the modified code:
===============MMapTest.java===================
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
public class MMapTest
{
public static void main(String[] args)
throws IOException, InterruptedException
{
File f = File.createTempFile("test", ".mmap");
RandomAccessFile raf = new RandomAccessFile(f, "rw");
showModTime(1, "Create,open raf ", f);
raf.write("Test file\n".getBytes("UTF-8"));
showModTime(2, "Write ", f);
raf.getFD().sync();
showModTime(3, "Sync ", f);
FileChannel channel = raf.getChannel();
MappedByteBuffer buf =
channel.map(MapMode.READ_WRITE, 0, f.length());
buf.put("Mapd".getBytes("UTF-8"));
showModTime(4, "Mapped,put ", f);
buf.force();
showModTime(5, "Force ", f);
channel.close();
showModTime(6, "Close ", f);
raf = new RandomAccessFile(f, "r");
showModTime(7, "Reopen raf ", f);
System.err.println(" File content : = " + raf.readLine());
showModTime(8, "Read ", f);
raf.close();
showModTime(9, "Close ", f);
}
private static void showModTime(int n, String label, File f)
throws InterruptedException
{
long t = f.lastModified();
System.err.println(n + " " + label + ": = " + t);
Thread.sleep(1000);
}
}
===============MMapTest.java===================
--
martin@ | Martin Gregorie
gregorie. | Essex, UK
org |