Запись в начале текстового файла Java - PullRequest
8 голосов
/ 25 мая 2011

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

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

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

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

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

Только что составил контент :) Как я могу изменить текстовый файл таким образом?

Ответы [ 5 ]

21 голосов
/ 25 мая 2011

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

  • Создать новый файл
  • Запишите к нему префикс
  • Скопировать данные из старого файла в новый файл
  • Переместить старый файл в папку для резервного копирования
  • Переместить новый файл в местоположение старого файла
  • При желании удалить старый файл резервной копии
6 голосов
/ 27 апреля 2017

На всякий случай для кого-то здесь будет полезен полный исходный код метода для добавления строк в файл с использованием библиотеки 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);
}
2 голосов
/ 09 июля 2012

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

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

String fileString = FileUtils.readFileToString(file);
2 голосов
/ 25 мая 2011

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

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

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

InputStream inputStream = new SequenceInputStream(new ByteArrayInputStream("my line\n".getBytes()), new FileInputStream(new File("myfile.txt")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...