Java 7 定义这个选项 http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardOpenOption.html#SPARSE,但我无法理解它的用处。考虑这个简单的程序,在一台足够新的 Linux 机器上运行,带有 Java 6 JVM:
public static void main(final String... args)
throws IOException
{
final long offset = 1L << 31;
final RandomAccessFile f = new RandomAccessFile("/tmp/foo", "rw");
f.seek(offset);
f.writeInt(2);
f.close();
}
当我查询文件“shellwise”时,我得到了预期的结果:
$ cd /tmp
$ stat --format %s foo
2147483652
$ du --block-size=1 foo
4096 foo
也就是说,inode 如实声明文件大小接近 2 GB,但其磁盘使用量实际上是单个块,因为底层 fs 的块大小为 4k。好的。
但我不需要 Java 7StandardOpenOption.SPARSE
为了那个原因。事实上,如果我使用 Java 7 JVM 运行完全相同的代码,结果不会有所不同。
现在,来看一些仅 Java 7 的代码:
public static void main(final String... args)
throws IOException
{
final ByteBuffer buf = ByteBuffer.allocate(4).putInt(2);
buf.rewind();
final OpenOption[] options = {
StandardOpenOption.WRITE,
StandardOpenOption.CREATE_NEW
};
final Path path = Paths.get("/tmp/foo");
Files.deleteIfExists(path);
try (
final SeekableByteChannel channel
= Files.newByteChannel(path, options);
) {
channel.position(1L << 31);
channel.write(buf);
}
}
This also创建一个稀疏文件,我不必指定StandardOpenOption.SPARSE
at all.
那么,它是用来做什么的呢?是否存在任何操作系统/文件系统组合,该选项实际上会影响行为?