Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top