Java 7 defines this option, но я не в состоянии понять его usefulness.Consider эту простую программу, работать на достаточно недавней машине Linux с Java 6 JVM:Что такое StandardOpenOption.SPARSE?
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();
}
Когда я запрашиваю файл «оболочки мудрой», Я получаю, как и ожидалось:
$ cd /tmp
$ stat --format %s foo
2147483652
$ du --block-size=1 foo
4096 foo
То есть индексный дескриптор правдиво заявляет, что файл имеет размер, близкий к 2 Гб, но его использование диска фактически один блок, так как основные фс имеет 4k размер блока , Хорошо.
Но для этого мне не нужна Java 7's StandardOpenOption.SPARSE
. На самом деле, если я запустил этот точный код с JVM Java 7, результаты не меняются.
Теперь, на какой-то 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.PARSE
вообще.
Итак, для чего он используется? Есть ли какая-либо комбинация ОС/файловой системы, где эта опция действительно влияет на поведение?
так как вы указали, что работаете над linux. поэтому какую файловую систему вы используете? ext4 или ext3? Потому что я хочу знать, так как создать файл с java на linux будет по-прежнему разреженным, но как я могу создать тот же файл с нерезким в java? –