Согласно API, это факты:
- Попросту говоря, метод
seek(long bytePosition)
перемещает указатель в позицию, указанную параметромbytePosition
. - Когда
bytePosition
больше, чем длина файла, длина файла не изменяется, если байт не записан на (новом) конце. - Если данные присутствуют в пропущенной длине, такие данные остаются нетронутыми.
Однако меня интересует ситуация: когда есть файл без данных (0 байт), и я выполняю следующий код:
file.seek(100000-1);
file.write(0);
Все 100 000 байт заполняются 0
практически мгновенно. Я могу синхронизировать более 200 ГБ, скажем, за 10 мс.
Но когда я пытаюсь записать 100000 байт другими методами, такими как BufferedOutputStream
, тот же процесс занимает почти бесконечно больше времени.
В чем причина такой разницы во времени? Есть ли более эффективный способ создать файл размером n
байт и заполнить его 0
?
РЕДАКТИРОВАТЬ: Если данные на самом деле не записываются, как файл заполняется данными? Пример этого кода:
RandomAccessFile out=new RandomAccessFile("D:/out","rw");
out.seek(100000-1);
out.write(0);
out.close();
Это результат:
Кроме того, если файл достаточно большой, я больше не могу записывать на диск из-за нехватки места.