Да, используйте RandomAccessFile
- вот для чего оно. Вы могли бы потенциально использовать FileChannel
, но я бы сначала пошел на RandomAccessFile
- это, вероятно, будет проще.
Обратите внимание, что вы не сможете "вставить в середину" файл после написания конечной части: я не знаю ни одной файловой системы, которая бы поддерживала это. Вам нужно знать полный размер, прежде чем писать последний раздел. Альтернативой может быть последовательная запись, запоминание последнего бита до конца.
Если вы можете дать нам больше информации о том, что вам нужно делать (и когда у вас есть информация о размере), мы можем помочь вам больше.
РЕДАКТИРОВАТЬ: Чтобы создать файл с определенным размером, вы можете seek()
после конца, а затем записать данные:
import java.io.*;
public class Test
{
// Just for the sake of a simple test program!
public static void main(String[] args) throws Exception
{
RandomAccessFile file = new RandomAccessFile("file.dat", "rw");
file.seek(100);
file.write(0);
file.close();
}
}
После выхода из него file.dat
будет иметь длину 101 байт. (Обратите внимание, что обычно вы используете try / finally и т. Д.)
РЕДАКТИРОВАТЬ: Как указано в комментариях coobird, setLength()
также будет расширять файл - но он также будет обрезать файл, если вы укажете длину меньше текущего размера. Учитывая ваш комментарий о написании торрент-данных, я подозреваю, что поиск, а затем запись - это именно то поведение, которое вам нужно. Когда вы получите чанк, просто ищите нужное место, запишите его, и файл расширится, когда потребуется.