1

「標準」Java (J2SE 5 以降) を介してハードディスク領域を確実に「割り当て」(予約) する方法はありますか?

たとえば、すべてのスレッドがファイルをダウンロードするスレッド プールで実行されるマルチスレッド アプリケーションの場合を考えてみましょう。ディスク領域の枯渇によってアプリケーションのダウンロードが中断されないようにするには、どうすればよいでしょうか?

少なくとも、ダウンロードしているファイルのサイズを事前に知っている場合、他のスレッドが何をしているかに関係なく、ファイルのダウンロードを保証する何らかの「予約」を行うことができますか?

( StackOverflowにも同様の質問がありますが、マルチスレッドについては説明されておらず、NIO も使用されています。)

編集:さらにテストした後、同様の質問で提案されたソリューションは機能しないようです。これは、基になるハードディスク容量に関係なく、提案された RandomAccessFile アプローチを介して許可された任意の長さを設定できるためです。たとえば、空き容量が数ギガバイトしかないパーティションで、自由に TB (テラバイト!) ファイルを作成できました。

File クラスの getFreeSpace() メソッドが新しいファイルを作成するたびに使用可能なスペースの量が減少したことを報告した場合、解決策は十分でしたが、実際にはそうではなく、実際にはこれらのファイルの長さがゼロであることを確認します。持っているようです。

これらは少なくとも、VMWare Player 4.0.0 で実行されている CentOS 5.6 仮想マシンで見た結果です。

4

1 に答える 1

1

ファイルにゼロを書き込みます。これにより、ディスク容量が確実に割り当てられます (ドライブ圧縮またはその他のファイルの可変サイズ エンコーディングが使用されている場合を除く)。

すべてのブロックに 1 つのゼロを書き込むだけで済む場合もありますが、ブロックサイズを決定するのは簡単ではない場合があります。

これは、すべてのスペースが割り当てられていないスパース ファイルの作成を避けるためです。

于 2011-10-21T07:50:48.803 に答える