Запись в начале текстового файла Java

Мне нужно что-то записать в начало текстового файла. У меня есть текстовый файл с контентом, и я хочу написать что-то перед этим контентом. Скажи, что есть;

Добрый день, сэр, как поживаете?
Я в порядке, как ты?
Спасибо, что спросили, я отлично

после изменения,я хочу, чтобы это было так:

Страница 1-Сцена 59
25.05.2011

Добрый день,сэр, как вы сегодня?
Я в порядке, как ты?
Спасибо, что спросили, я отлично

просто составил содержание :) Как я могу изменить текстовый файл, как этот способ?

5 ответов


вы не можете действительно изменить это так - файловые системы обычно не позволяют вставлять данные в произвольных местах - но вы можете:

  • создать новый файл
  • напишите приставку к нему
  • скопировать данные из старого файла в новый файл
  • переместить старый файл в резервную копию
  • переместить новый файл на место старого файла
  • при необходимости удалите старый файл резервной копии

на всякий случай это будет полезно для кого-то здесь полный исходный код метода для добавления строк в файл с помощью Apache Commons IO библиотека. Код не считывает весь файл в память, поэтому будет работать с файлами любого размера.

public static void prependPrefix(File input, String prefix) throws IOException {
    LineIterator li = FileUtils.lineIterator(input);
    File tempFile = File.createTempFile("prependPrefix", ".tmp");
    BufferedWriter w = new BufferedWriter(new FileWriter(tempFile));
    try {
        w.write(prefix);
        while (li.hasNext()) {
            w.write(li.next());
            w.write("\n");
        }
    } finally {
        IOUtils.closeQuietly(w);
        LineIterator.closeQuietly(li);
    }
    FileUtils.deleteQuietly(input);
    FileUtils.moveFile(tempFile, input);
}

Я думаю, что вы хотите, случайный доступ. Проверьте связанный учебник java. Однако я не верю, что вы можете просто вставлять данные в произвольной точке файла; если я правильно помню, вы только перезаписываете данные. Если вы хотите вставить, вы должны иметь свой код

  1. скопировать блок,
  2. перепишите свои новые вещи,
  3. скопируйте следующий блок
  4. перезаписать ранее скопированным блоком,
  5. вернуться к 3, пока не больше блоков

Как предложил @atk,java.nio.channels.SeekableByteChannel хороший интерфейс. Но он доступен только с 1.7.

Update : если у вас нет проблем с использованием FileUtils, используйте

String fileString = FileUtils.readFileToString(file);

это не прямой ответ на вопрос, но часто файлы доступны через InputStreams. Если это ваш вариант использования, то вы можете связывать входные потоки через SequenceInputStream для достижения того же результата. Е. Г.

InputStream inputStream = new SequenceInputStream(new ByteArrayInputStream("my line\n".getBytes()), new FileInputStream(new File("myfile.txt")));