Запись в файл по определенному индексу - PullRequest
2 голосов
/ 12 августа 2011

Мне нужно записать в файл в определенной позиции индекса. BufferedWriter и PrintWriter не разрешают запись в индекс. Как мне добиться этого?

По сути, я хочу сделать, если файл содержит пустую строку в EOF, тогда мне нужно написать в этой позиции, иначе вставить новую строку и написать. Копирование содержимого файла во временный файл с последующим удалением исходного файла и последующим повторным переименованием временного файла в имя исходного файла не поддерживается.

Спасибо

Ответы [ 2 ]

5 голосов
/ 12 августа 2011

Вам необходимо использовать RandomAccessFile.

Используя этот класс, вы можете перейти в определенное место, используя метод seek(long), и писать, используя различные методы write.

В случае вашей особой проблемы наилучшим решением будет использовать RandomAccessFile и перейти к концу вашего файла. Убедитесь, что это новая строка, напишите, закройте.

0 голосов
/ 31 марта 2016

Дан метод записи контента в определенной позиции.

Допустим, мой файл Test.txt и его содержимое выглядит следующим образом

Hello 
How are you
Today is Monday

теперь вы хотите написать " hi " после приветствия. Таким образом, смещение для « hi » будет равно «5».

Метод:

filename = "test.txt";
offset = 5;
byte[] content = ("\t hi").getBytes();

private void insert(String filename, long offset, byte[] content) throws IOException {

    RandomAccessFile r = new RandomAccessFile(filename, "rw");
    RandomAccessFile rtemp = new RandomAccessFile(filename+"Temp", "rw");
    long fileSize = r.length(); 
    FileChannel sourceChannel = r.getChannel();
    FileChannel targetChannel = rtemp.getChannel();
    sourceChannel.transferTo(offset, (fileSize - offset), targetChannel);
    sourceChannel.truncate(offset);
    r.seek(offset);
    r.write(content);
    long newOffset = r.getFilePointer();
    targetChannel.position(0L);
    sourceChannel.transferFrom(targetChannel, newOffset, (fileSize - offset));
    sourceChannel.close();
    targetChannel.close();
    rtemp.close();
    r.close();

}

Вывод будет:

Hello hi
How are you
Today is Monday
...