Как заменить строку в java-файле

Обновлено: 21.11.2024

Как заменить строку текста в текстовом файле?

У меня есть строка, например:

И я хочу обновить его с помощью:

Как мне это сделать?

Кстати, я хочу заменить ТОЛЬКО ту строку, которая была прочитана. НЕ весь файл.

Этот вопрос помечен строкой замены java jcheckbox

~ Вопрос задан 2013-11-18 04:15:39

6 ответов

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

Содержимое исходного текстового файла:

Помыть посуду0
Покормить собаку0
Убрать мою комнату1

Помыть посуду0
Покормить собаку0
Убрать мою комнату1
----------------------- -----------
Помыть посуду1
Покормить собаку0
Убрать мою комнату1

Содержимое нового текстового файла:

Помыть посуду1
Покормить собаку0
Убрать мою комнату1

И в качестве примечания, если текстовый файл был:

Помыть посуду1
Покормить собаку0
Убрать мою комнату1

и вы использовали метод replaceSelected("Помыть посуду", "1"); , это просто не изменит файл.

Поскольку этот вопрос довольно специфичен, я добавлю сюда более общее решение для будущих читателей (исходя из названия).

~ Отвечено 2013-11-18 04:47:39

Начиная с Java 7, это очень просто и интуитивно понятно.

По сути, вы читаете весь файл в список, редактируете список и, наконец, записываете список обратно в файл.

FILE_PATH представляет собой путь к файлу.

~ Отвечено 2016-06-03 22:02:23

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

Помните, что вам придется перезаписать текстовый файл. Сначала я читаю весь файл и сохраняю его в строке. Затем я сохраняю каждую строку как индекс массива строк, например, первая строка = индекс массива 0. Затем я редактирую индекс, соответствующий строке, которую вы хотите отредактировать. Как только это будет сделано, я объединяю все строки в массиве в одну строку. Затем я записываю в файл новую строку, которая перезаписывает старое содержимое. Не беспокойтесь о потере старого контента, так как он был заново написан с правкой. ниже приведен код, который я использовал.

~ Отвечено 2016-09-15 22:38:04

Если замена имеет разную длину:

  1. Читайте файл, пока не найдете строку, которую хотите заменить.
  2. Прочитайте в памяти всю часть после текста, который вы хотите заменить.
  3. Обрежьте файл в начале части, которую вы хотите заменить.
  4. Напишите замену.
  5. Запишите оставшуюся часть файла, начиная с шага 2.

Если замена имеет одинаковую длину:

  1. Читайте файл, пока не найдете строку, которую хотите заменить.
  2. Установите позицию файла в начале части, которую вы хотите заменить.
  3. Запись замены, перезапись части файла.

Это лучшее, что вы можете получить, учитывая ограничения вашего вопроса. Однако, по крайней мере, рассматриваемый пример заменяет строку той же длины, поэтому второй способ должен работать.

Напишите программу или функцию Java для замены определенной строки в текстовом файле. Ваша программа должна взять на вход один текстовый файл и заменить определенную строку в этом текстовом файле новой строкой.

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

Мы определяем один метод с именем modifyFile(). Этот метод считывает все содержимое входного текстового файла в объект String, заменяет старую строку новой строкой и перезаписывает новое содержимое обратно в тот же файл. Он принимает три аргумента: путь к изменяемому файлу — filepath, заменяемая строка — oldString и заменяемая строка — newString. . Давайте посмотрим, как этот метод работает шаг за шагом.

Шаг 1. Создайте объект File, указав путь к файлу, который нужно изменить.

Файл fileToBeModified = новый файл (путь к файлу)

Шаг 2. Инициализируйте oldContent пустой строкой. Этот объект String будет содержать все старое содержимое входного текстового файла.

Шаг 3. Создайте объект BufferedReader для чтения входного текстового файла построчно.

Считыватель BufferedReader = новый BufferedReader(новый FileReader(fileToBeModified))

Шаг 4. Прочитайте все строки входного текстового файла одну за другой и добавьте их в oldContent.

Строка line = reader.readLine();

пока (строка != null)

oldContent = oldContent + line + System.lineSeparator();
line = reader.readLine();
>

Шаг 5. Замените все вхождения oldString на newString с помощью метода replaceAll().Вы получите newContent.

String newContent = oldContent.replaceAll(oldString, newString)

Шаг 6. Теперь создайте объект FileWriter для записи newContent обратно во входной текстовый файл fileToBeModified.

Писатель FileWriter = новый FileWriter(fileToBeModified)

Шаг 7. Перепишите fileToBeModified с помощью newContent, используя метод write() объекта FileWriter.

Шаг 8. Закройте ресурсы.

Программа Java для замены определенной строки в текстовом файле:

Приведенная ниже программа использует StudentFile.txt в качестве входных данных и заменяет отметки 85 на 95.

В этом руководстве мы узнаем, как читать строки из файла, как изменять содержимое, а затем снова записывать их в тот же файл. Мы не получаем никаких данных от пользователя. В этом примере после прочтения содержимого файла мы заменяем все слова новые словами старые. Например, если файл содержит одну строку Это новый мяч, после модификации она станет Это старый мяч. Прежде чем перейти к более подробной информации, давайте рассмотрим программу:

  1. Создайте две переменные String для хранения пути к файлу и содержимого файла. originalFilePath — это путь к файлу, который мы собираемся прочитать, а originalFileContent — это содержимое этого файла. Мы прочитаем файл и сохраним его в originalFileContent.
  2. Создайте один объект BufferedReader и один объект BufferedWriter . Мы будем использовать их для чтения и записи содержимого файла.
  3. Запустите цикл try-catch-finally, чтобы выполнить файловые операции.
  4. Создайте один объект BufferedReader . Мы передаем один объект FileReader конструктору, который содержит путь к файлу.
  5. Прочитайте первую строку файла и сохраните ее в строке currentReadingLine.
  6. Мы продолжим чтение из файла и сохраним его в переменной currentReadingLine. А затем мы добавим его к основной переменной originalFileContent. Цикл while будет выполняться до тех пор, пока чтение файла не завершится.
  7. Теперь у нас есть все содержимое файла в переменной originalFileContent. Используя метод replaceAll, мы заменили все 'новые' слова на 'старые' и сохранили их в переменной modifiedFileContent.
  8. Затем с помощью BufferedWriter откройте тот же файл.
  9. Запишите измененные строки в файл.
  10. Наконец, закройте объекты BufferedReader и BufferedWriter.

Предположим, что входной файл содержит следующие строки:

Мы сохраняем его в файле «sample.txt» на диске «C». Теперь, если вышеуказанная программа запустится, она изменит файл, как показано ниже:

Класс String Java имеет три типа методов замены:

  1. заменить()
  2. заменитьВсе()
  3. заменитьFirst()

С помощью функции replace() в Java вы можете заменять символы в строке. Давайте подробно изучим каждую функцию строкового API Java:

Метод замены строки Java

Метод Java String replace() заменяет каждое вхождение заданного символа новым символом и возвращает новую строку. Строковый метод Java replace() позволяет заменить последовательность значений символов.

Синтаксис:

Параметры:

oldCh – старый персонаж

newCh – новый персонаж

Возвращаемое значение

Функция replace() в Java возвращает строку, заменяя oldCh на newCh.

Пример замены() в Java:

Давайте разберем функцию replace() в Java на примере:

Вывод:

Исходная строка: ': быстрая лиса прыгнула
Строка после замены "лисы" на "собаку": быстрая собака прыгнула
Строка после замены всех букв "т" на "а": ахе быстрая лиса прыгнул

Заменить все строки Java

Метод Java String replaceAll() находит все вхождения последовательности символов, совпадающей с регулярным выражением, и заменяет их строкой замены. В конце вызова функция replaceAll() в Java возвращает новую строку.

Параметры:

regx: регулярное выражение

замена: замена последовательности символов

Пример:

Вывод:

Строка Java replaceFirst()

Метод Java String replaceFirst() заменяет ТОЛЬКО первую подстроку, соответствующую заданному регулярному выражению. Сопоставление строки начинается с начала строки (слева направо). В конце вызова функция Java replaceFirst() возвращает новую строку.

Синтаксис

Параметры

RGEX — регулярное выражение, которому должна соответствовать данная строка.

замена — строка, заменяющая регулярное выражение.

Возвращаемое значение

Этот метод возвращает результирующую строку в качестве выходных данных.

Пример replaceAll() в Java:

Вывод:

Веб-сайт Thi9 с бесплатными учебными пособиями

Как заменить символ в строке в JAVA?

Метод Java String replace() заменяет каждое вхождение заданного символа новым символом и возвращает новую строку.
Синтаксис метода replace(): имя_строки. заменить(старая_строка, новая_строка)

Одной из наиболее часто используемых функций для объектов String в Java является замена строки. С помощью replace() вы можете заменить вхождение символьного или строкового литерала другим символьным или строковым литералом.

Метод String.replace() можно использовать в следующих ситуациях:

  • Замена специальных символов в строке (например, строку с немецким символом ö можно заменить на oe). Это не изменит значения слова, но поможет сделать строку более понятной для всех.
  • Чтение данных из файла CSV со значениями, разделенными запятыми. Разделители можно заменить пробелом, используя метод replace для разделения слов.
  • Обработка URL-адресов в Java. Возможно, вам придется закодировать строку, чтобы заменить специальные символы (например, пробел нужно заменить на %20).

В Java имейте в виду, что объекты String неизменяемы, что означает, что объект нельзя изменить после его создания. С другой стороны, объекты StringBuffer и StringBuilder являются изменяемыми, то есть их можно изменить после создания. Таким образом, в некоторых ситуациях String.replace() может не быть лучшим способом замены символа в строке.

В этом руководстве вы узнаете:

  • Как String.replace() , StringBuilder.replace() , StringBuffer.replace() можно использовать для замены определенного символа или подстроки в строке и когда использовать каждый из них.
  • Что происходит с неизменяемым объектом String при использовании replace() или replaceAll().
  • Как String.replaceAll() может заменить все вхождения определенного символа или подстроки в строке.

Использование String.replace()

String.replace() используется для замены всех вхождений определенного символа или подстроки в данном объекте String без использования регулярного выражения. В Java для replace() доступны два перегруженных метода: String.replace() с Character и String.replace() с CharSequence.

String.replace() с символом

Этот метод принимает oldChar и newChar , затем заменяет все oldChar в заданном строковом литерале на newChar и возвращает результирующий объект String.

String.replace() на CharSequence

Этот метод принимает целевую CharSequence и замещающую CharSequence, затем заменяет всю целевую CharSequence замещающей CharSequence и возвращает результирующий объект String.

CharSequence — это интерфейс на языке Java, реализованный с помощью String , StringBuffer и StringBuilder . Вы можете использовать любую из этих реализаций вместо CharSequence.

Хотя сигнатуры различаются, эти две реализации метода replace() работают практически одинаково.

Примеры String.replace()

Давайте воспользуемся методом replace() с параметром типов Char для замены одного символа. Вы будете использовать только одинарные кавычки в параметрах метода replace() для обозначения oldChar и newChar как символов. Двойные кавычки превращают параметры в строку.

Когда вы запустите приведенную выше программу, вы увидите следующий вывод:

Несколько замечаний:

  1. В первой строке была напечатана исходная строка со специальным символом ö.
  2. При использовании метода replace() все вхождения специального символа ö заменяются на o.
  3. При использовании метода replace() исходная строка не изменяется. Он всегда возвращает новый объект String.

Если вы используете метод replace() с параметрами типа CharSequence (обозначаются двойными кавычками вместо одинарных):

Вы увидите аналогичный результат и исходную неизмененную строку:

Вы также можете использовать метод replace() с реализацией StringBuilder вместо типов CharSequence”:

При выполнении этого варианта вы увидите тот же результат, что и в предыдущем примере.

Хотя метод replace() может быть очевидным выбором для большинства операций замены строк, это не единственный вариант. В следующем разделе я расскажу о методе replace() в StringBuilder.

Использование StringBuilder.replace()

StringBuilder — это изменяемая последовательность символов. Это не потокобезопасно; методы не синхронизированы.Он заменит последовательность подстрок в диапазоне, переданном в качестве параметров индекса, заменяющей строкой.

Этот метод следует использовать, если вы хотите выполнить операцию замены в однопоточной программе Java. Вы также можете использовать его в программах с несколькими потоками, но это не рекомендуется, поскольку методы не синхронизированы.

Сначала создайте StringBuilder, инициализированный строкой со специальным символом ö, используя следующее:

Затем используйте метод replace() со StringBuilder .

Метод replace() принимает три параметра: startIndex , endIndex и replaceString .

  • startIndex — это начальный индекс замены в строковом литерале. Это включительно, что означает, что если вы укажете 1, индекс 1 строки будет включен в замену.
  • endIndex — это конечный индекс замены в строковом литерале. Он является эксклюзивным, что означает, что если вы укажете 5, индекс 5 строки не будет включен в замену. Замены производятся только через индекс 4.
  • replacementString — это фактическая замещающая строка. Указанный диапазон индексов в литерале String будет заменен этой строкой.

Теперь у вас есть индекс специальных символов в int , который можно передать методу replace. В следующем примере показан полный код Java для использования StringBuilder.replace() :

Выполнив приведенный выше код, вы увидите следующий вывод:

Несколько замечаний:

  1. Первая строка выводит исходную строку со специальным строковым литералом ö.
  2. При использовании метода StringBuilder.replace() только символы, указанные в параметрах startIndex и endIndex, заменяются на o. Он не заменяет все события. Вы можете видеть, что символ ö в конце не заменяется.
  3. При использовании метода StringBuilder.replace() исходный объект StringBuilder изменяется. Это связано с тем, что StringBuilder является изменяемым и изменяется напрямую.

В некоторых случаях может потребоваться изменчивость, но будьте осторожны. Это может быть непреднамеренным побочным эффектом.

Использование StringBuffer.replace()

StringBuffer – это изменяемая последовательность символов. Подобно StringBuilder.replace() , он заменит последовательность подстрок в диапазоне, переданном в качестве параметров индекса, заменяющей строкой, но это потокобезопасно. Используйте этот метод, если вы хотите выполнить операцию замены в многопоточной программе Java.

Для начала создайте StringBuffer, инициализированный строкой со специальным символом ö, аналогично тому, как вы это делали с StringBuilder выше:

Метод replace() принимает три параметра:

  • startIndex — это начальный индекс замены в строковом литерале. Это включительно, что означает, что если вы укажете 1, индекс 1 строки будет включен в замену.
  • endIndex — это конечный индекс замены в строковом литерале. Он является эксклюзивным, что означает, что если вы укажете 5, индекс 5 строки не будет включен в замену. Замены производятся только через индекс 4.
  • replacementString — фактическая строка замены. Указанный диапазон индексов в литерале String будет заменен этой строкой.

Индекс заменяемого персонажа является обязательным параметром, поэтому вы можете использовать метод indexOf(), чтобы найти его. В следующем примере показан полный код Java для использования StringBuffer.replace() :

Как и в случае с StringBuilder выше, StringBuffer.replace() не заменяет все экземпляры специального символа и изменяет исходный строковый буфер:

Использование String.replaceAll()

  • regex – это регулярное выражение, которое необходимо найти для поиска подстроки.
  • replacementString – это строка, которая заменит совпадающую подстроку.

Разница между String.replaceAll() и String.replace()

Основываясь только на имени, вы можете предположить, что replaceAll() заменит все вхождения символа или подстроки, и вы будете правы, но String.replace() также заменит все вхождения символа или подстроки.

Единственная разница между ними заключается в том, что с replaceAll() вы можете использовать регулярное выражение для сопоставления подстроки, которую необходимо заменить, тогда как с replace() вы не можете использовать регулярное выражение . Он принимает только Character или CharSequence .

Поэтому используйте replaceAll(), когда вы не знаете точную подстроку, которую нужно заменить, но можете найти ее с помощью регулярного выражения.

Например, вы можете получить ответ в виде строки HTML при использовании службы RESTful из вашей программы Java. В HTML вы можете извлечь только текст и игнорировать все теги HTML.

В следующем примере показано, как использовать replaceAll() с регулярным выражением для удаления всех тегов HTML из ответа:

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

Когда вы запустите приведенную выше программу, вы увидите следующий вывод:

Как видите, исходная строка не была изменена, но в замененной строке удалены все теги. Регулярные выражения очень полезны, когда у вас есть сложные правила замены строк, поэтому replaceAll() будет хорошим методом, чтобы держать его в своем наборе инструментов.

Заключение

В этом руководстве вы узнали, как использовать методы String.replace() , StringBuilder.replace() и StringBuffer.replace() для замены всех вхождений подстроки. Вы также узнали, какую реализацию Char следует использовать в случае однопоточной или многопоточной Java-программы и как использовать replaceAll() с регулярным выражением.

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

Технический писатель и блогер, стремящийся обеспечить лучший в своем классе опыт чтения. Викрам много пишет на темы, связанные с Java, облаком AWS и профессией программирования в целом.

Читайте также: