3

APIによると、これらは事実です。

  • このseek(long bytePosition)メソッドは簡単に言えば、パラメーターで指定された位置にポインターを移動しbytePositionます。
  • bytePositionがファイル長より大きい場合、(新しい) 末尾にバイトが書き込まれない限り、ファイル長は変更されません。
  • 読み飛ばした長さのデータが存在する場合、そのデータはそのまま残される。

ただし、気になる状況は次のとおりです。データのないファイル (0 バイト) があり、次のコードを実行した場合:

file.seek(100000-1);
file.write(0);

100,000 バイトすべてが0ほぼ瞬時にいっぱいになります。たとえば、10ミリ秒で200GB以上をクロックできます。

しかし、同じプロセスなどの他の方法を使用して 100000 バイトを書き込もうとするとBufferedOutputStream、ほぼ無限に長い時間がかかります。

この時間の違いの理由は何ですか?nバイトのファイルを作成して s で埋めるより効率的な方法はあります0か?

編集: データが実際に書き込まれていない場合、ファイルはどのようにデータで満たされていますか? このコードのサンプル:

RandomAccessFile out=new RandomAccessFile("D:/out","rw");
out.seek(100000-1);
out.write(0);
out.close();

これは出力です:

出力

さらに、ファイルが十分に大きい場合、スペース不足のためにディスクに書き込むことができなくなります。

4

2 に答える 2