Выделите место на диске для нескольких загрузок файлов в Java
Есть ли способ надежно "выделить" (зарезервировать) пространство на жестком диске через "стандартную" Java (J2SE 5 или более позднюю версию)?
Возьмем, например, случай многопоточного приложения, выполняющегося в пуле потоков, где каждый поток загружает файлы. Как приложение может убедиться, что его загрузка не будет прервана в результате исчерпания дискового пространства?
По крайней мере, если он заранее знает размер загружаемого файла, может ли он выполнить какое-то "резервирование", которое гарантировало бы загрузку файла, независимо от того, что делают другие потоки?
(Существует аналогичный вопрос в Stackru, но он не обсуждает многопоточность и также использует NIO.)
РЕДАКТИРОВАТЬ: После некоторого дальнейшего тестирования решение, предложенное по аналогичному вопросу, похоже, не работает, так как можно установить ЛЮБУЮ допустимую длину с помощью предложенного подхода RandomAccessFile, независимо от базового пространства на жестком диске. Например, на разделе, имеющем всего несколько гигабайт, я смог создать файлы TB (террабайт!) По желанию.
Решение было бы достаточно, если бы метод getFreeSpace() класса File сообщал об уменьшении объема доступного пространства каждый раз, когда создавался новый файл, но на самом деле это не так, подтверждая, таким образом, нулевую длину, которая, на практике, этих файлов кажется.
Это, по крайней мере, результаты, которые я вижу на виртуальной машине CentOS 5.6, работающей в VMWare Player 4.0.0.
1 ответ
Запишите нули в файл. Это обеспечит выделение дискового пространства (если только не используется сжатие диска или какая-либо другая кодировка файла переменного размера).
Возможно, вам не составит труда написать один ноль для каждого блока, но определение размера блока может быть не тривиальным.
Это делается для того, чтобы избежать создания разреженного файла, в котором не выделено все ваше пространство.