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();
これは出力です:
さらに、ファイルが十分に大きい場合、スペース不足のためにディスクに書き込むことができなくなります。