как записать содержимое в определенную позицию в файле

#java #inputstream #textinput #fileinputstream

#java #входной поток #textinput #fileinputstream

Вопрос:

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

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

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

Абхишек

после «я есть», как я Абхишек, .. Как записать содержимое непосредственно в эту конкретную позицию.

Ответ №1:

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

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

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

Ответ №2:

Вы не можете вставить данные в файл. Вы можете перезаписать данные в определенном месте с помощью 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:

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

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

Ответ №4:

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

введите описание изображения здесь

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

Комментарии:

1. Пожалуйста, избегайте публикации скриншотов, даже если они выделены синтаксисом. Скриншоты не позволяют людям с ограниченными возможностями (которые используют программы чтения с экрана) понимать содержимое. Также не позволяйте обычным людям копировать / вставлять соответствующие части кода

Ответ №5:

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

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