#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:
У вас есть три варианта:
- Заполните исходную запись достаточным пространством, чтобы можно было использовать RandomAccessFile (и вам не нужны дополнительные пробелы в конце. Простая, но ограниченная утилита
- Используйте механизм создания шаблонов (StringTemplate, Velocity и т.д.), Если вы часто этим занимаетесь. Возможно, слишком много работы, если вы делаете это только один раз.
- Напишите свой собственный простой механизм создания шаблонов, который считывает его в память, выполняет замену регулярных выражений и записывает его обратно. Не особенно эффективно, но если у вас очень простое и ограниченное использование, возможно, лучший компромисс.