как записать содержимое в определенную позицию в файле - PullRequest
12 голосов
/ 26 апреля 2011

Предположим, у меня есть файл с именем abhishek.txt, который содержит следующую строку

Я и как вас зовут.

Теперь я хочу написать

Abhishek

после "Я есть", как я Abhishek, .. Как написать содержание в этой конкретной позиции напрямую.

Ответы [ 5 ]

11 голосов
/ 26 апреля 2011

Вы не можете вставить данные в файл ... файловые системы (в общем) просто не поддерживают такую ​​операцию.Обычно вы открываете один файл для чтения, а другой - для записи, копируете первую часть файла из одного потока в другой, записываете дополнительную часть, а затем копируете вторую часть файла.

Если выЕсли вы пытаетесь заменить исходный файл, вам нужно будет удалить его и переместить новый файл на место.

Иногда бывает проще прочитать весь файл в памяти за один раз - это зависит отименно то, что вы пытаетесь сделать, и насколько большой файл.

7 голосов
/ 26 апреля 2011

Вы не можете вставить данные в файл. Вы можете перезаписать данные в определенном месте с помощью RandomAccessFile. Однако для вставки требуется изменить все данные после нее. Для вашего случая попробуйте что-то вроде этого:

File file = new File("abhishek.txt");
Scanner scanner = new Scanner(file).useDelimiter("\n");
String line = scanner.next();
String newLine = line.substring(0, 5) + "Abhishek" + line.substring(5);
FileWriter writer = new FileWriter(file);
writer.write(newLine);
writer.close();
3 голосов
/ 26 апреля 2011

Вообще говоря, вам нужно прочитать старый файл, изменить содержимое в памяти и снова записать его обратно.

Здесь есть много опций, независимо от того, читаете ли вы файл сразу илиНебольшой фрагмент за раз, заменяете ли вы существующий файл и т. д., но обычно это шаблон для использования.

2 голосов
/ 24 февраля 2017

Мне удалось сделать это с помощью RandomAccessFile:

enter image description here

С этим вы получите файл, содержащий точно ожидаемый контент «Я Абхишек». Это работает, даже если у вас будет содержимое после первой строки, которое вы хотите сохранить в файле (это была моя первоначальная проблема: у меня был большой файл, и мне пришлось вставлять некоторый контент после определенной строки), а не писать в конец файла, что проще.

2 голосов
/ 26 апреля 2011

У вас есть три варианта:

  1. Заполните исходную запись достаточным пространством, чтобы можно было использовать RandomAccessFile (и вам не нужно какое-то дополнительное место в конце. Простая, но ограниченная утилита
  2. Используйте движок шаблонов (StringTemplate, Velocity и т. Д.), Если вы часто этим занимаетесь. Возможно, слишком много работы, если вы делаете это только один раз.
  3. Напишите свой собственный простой движок шаблонов, который считывает его в память, заменяет регулярное выражение и записывает обратно. Не особенно эффективно, но если у вас очень простое и ограниченное использование, возможно, лучший компромисс.
...