4

Java 7定义了这个选项,但我无法理解它的用处。考虑这个简单的程序,在最近的 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();
}

当我查询“shell wise”文件时,我得到了,如预期的那样:

$ cd /tmp
$ stat --format %s foo
2147483652
$ du --block-size=1 foo
4096    foo

也就是说,inode 如实声明文件大小接近 2 GB,但它的磁盘使用量实际上是单个块,因为底层 fs 具有 4k 块大小。好的。

但我不需要 Java 7 StandardOpenOption.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);
    }
}

创建了一个稀疏文件,我根本不需要指定StandardOpenOption.SPARSE

那么,它是用来做什么的呢?是否存在此选项实际影响行为的任何操作系统/文件系统组合?

4

2 回答 2

6

Oracle 在I/O 教程中的注释将 NTFS 列为其中选项很重要的一个文件系统。微软关于NTFS 中稀疏文件支持的文档说,稀疏文件必须明确标记为稀疏,并且它列出了特定于稀疏文件的操作(清零区域、搜索具有非零数据的范围等)。

我没有方便的 Windows 框来尝试这个,但是看到教程特别提到了 NTFS,这可能是一个集中搜索的地方。

于 2013-07-18T07:41:17.320 回答
0

当您在 Linux 上使用这样的 RandomAccessFile 时,默认情况下在 ext4 上它是稀疏的,但是如果您尝试使用 ext3 或 Windows,您可能会发现它不是稀疏的。即普通 RandomAccessFile 构造函数的行为取决于操作系统。

于 2013-07-13T21:32:18.770 回答