2013-07-13 3 views
2

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 вообще.

Итак, для чего он используется? Есть ли какая-либо комбинация ОС/файловой системы, где эта опция действительно влияет на поведение?

+0

так как вы указали, что работаете над linux. поэтому какую файловую систему вы используете? ext4 или ext3? Потому что я хочу знать, так как создать файл с java на linux будет по-прежнему разреженным, но как я могу создать тот же файл с нерезким в java? –

ответ

2

Примечания Oracle в списке I/O tutorial NTFS как одна файловая система, в которой этот параметр имеет значение. В документах Microsoft на sparse file support in NTFS говорится, что разреженные файлы должны быть явно помечены как разреженные, и перечислены действия, характерные для разреженных файлов (обнуление регионов, поиск диапазонов с ненулевыми данными и т. Д.).

У меня нет окна Windows, в котором можно попробовать это, но, увидев, что в учебниках специально вызывается NTFS, это может быть место для фокусировки поиска.

+0

Ааа, интересно! У меня нет машины Windows ... – fge

0

Когда вы используете RandomAccessFile, подобный этому в Linux, по умолчанию он используется по умолчанию ext4, однако если вы попробуете ext3 или Windows, вы можете обнаружить, что он не разрежен. то есть поведение обычного конструктора RandomAccessFile зависит от ОС.

+0

Uh, ext3? Нет разреженной поддержки? ;) Извините, но нет, он поддерживал разреженный период с момента его создания, и поэтому имеет ext2 в этом отношении ('open (2)' и 'seek (2)' не изменились). Более того, мои fs - btrfs. Что касается Windows, ну, есть ли варианты, когда вы открываете/создаете файл, чтобы создать его разреженным или нет? – fge

+0

@fge Если он не поддерживает разреженные файлы, опция будет бессмысленной, опция - по умолчанию. –

+0

Подождите, подождите. У Ext2 + была поддержка разреженных файлов с самого начала. Вам не нужно открывать файл с этой опцией, чтобы созданный файл был редким (и, как я уже сказал, 'open (2)' не имеет такой опции - также не 'fopen (2)' по этому поводу). Мой вопрос на самом деле: _ужели этот вариант имеет смысл? В каком контексте? Насколько я знаю, он вообще не влияет на какую-либо хорошо продуманную систему Unix. – fge

Смежные вопросы