Выделите место на диске для нескольких загрузок файлов в Java - PullRequest
1 голос
/ 18 октября 2011

Есть ли способ надежно «выделить» (зарезервировать) пространство на жестком диске с помощью «стандартной» Java (J2SE 5 или более поздней версии)?

Возьмем, например, случай многопоточного приложения, выполняющегося в потокепул, куда каждый поток скачивает файлы.Как приложение может убедиться, что его загрузка не будет прервана в результате исчерпания дискового пространства?

По крайней мере, если оно заранее знает размер загружаемого файла, может ли оно выполнить какое-то«Резервирование», которое гарантировало бы загрузку файла, независимо от того, что делают другие потоки?

(В StackOverflow есть аналогичный вопрос , но он не обсуждает многопоточность и также использует NIO.)

РЕДАКТИРОВАТЬ: После некоторого дополнительного тестирования решение, предложенное по аналогичному вопросу, похоже, не работает, поскольку можно установить ЛЮБУЮ допустимую длину с помощью предлагаемого подхода RandomAccessFile, независимо отбазовое пространство на жестком диске.Например, на разделе, имеющем всего несколько гигабайт, я смог создать файлы TB (террабайт!) По своему усмотрению.

Решение было бы достаточно, если бы сообщал метод getFreeSpace () класса Fileуменьшенный объем доступного пространства каждый раз, когда создается новый файл, но на самом деле это не так, что подтверждает нулевую длину, которую на практике эти файлы, по-видимому, имеют.

Это, по крайней мере, результаты, которые яна виртуальной машине CentOS 5.6, запущенной в VMWare Player 4.0.0.

1 Ответ

1 голос
/ 21 октября 2011

Запись нулей в файл.Это обеспечит выделение дискового пространства (если только не используется сжатие диска или какая-либо другая кодировка файла переменного размера).

Возможно, вам не составит труда записать один ноль для каждого блока, но определить размер блокаможет не быть тривиальным.

Это необходимо для того, чтобы избежать создания разреженного файла , в котором не выделено все ваше пространство.

...