Java доступ к большому файлу - PullRequest
5 голосов
/ 23 июня 2009

Я ищу эффективный способ создания файла, размер которого неизвестен, но может варьироваться от мб до гб и заполнять его содержимое случайным образом. Я могу написать первые 200 байтов, затем перейти к концу и записать последние 200 байтов, переместиться в середину и написать там. RandomAccessFile эффективен для этого или есть какие-то альтернативы, более подходящие для такой работы?

Ответы [ 3 ]

10 голосов
/ 23 июня 2009

Да, используйте 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() также будет расширять файл - но он также будет обрезать файл, если вы укажете длину меньше текущего размера. Учитывая ваш комментарий о написании торрент-данных, я подозреваю, что поиск, а затем запись - это именно то поведение, которое вам нужно. Когда вы получите чанк, просто ищите нужное место, запишите его, и файл расширится, когда потребуется.

2 голосов
/ 04 января 2010

RandomAccessFile должен это сделать

1 голос
/ 23 июня 2009

Я думаю, что RandomAccessFile подходит для этой проблемы

...