Java java.util.regex.Matcher
replaceFirst(...)
/replaceAll(...)
API возвращает строки, которые (при использовании размера кучи по умолчанию) могут привести к тому, что OOME будет вводить значения до 20-50M символов. Эти 2 метода могут быть легко переписаны на write до Writer
с вместо того, чтобы создавать укусы, эффективно устраняя одну точку отказа.Java: замена регулярных выражений в больших файлах
Matcher
«s factory method, однако, принимает только CharSequence
с, что также, вероятно, бросить OOME, если я использую String
S/S/StringBuffer
StringBuilder
с.
Как обернуть java.io.Reader
реализовать интерфейс CharSequence
(учитывая тот факт, что мои регэкспы могут содержать обратные ссылки)? Есть ли другое решение, которое может заменять регулярные выражения в файлах и не является OOME-подверженным большим входам?
Другими словами, как реализовать функциональность, аналогичную функции GNU sed
, в Java (как известно, sed
имеет дело с файлами размером до нескольких терабайт, с той же поддержкой расширенных регулярных выражений)?
Нужно ли вам заменять только одну строку за раз или поддерживать замену «весь файл за один раз»? –
'Pattern.matcher()' не создает новую строку. Созданный объект 'Matcher' просто удерживает ссылку на переданную CharSequence. – nhahtdh
' sed' обрабатывает файлы поэтапно, что является причиной того, что для больших файлов не требуется много памяти (если только файл имеет * очень * длинные строки или код дает указание запомнить много вещей). Если вы сделаете то же самое в Java (например, прочитайте строку, поработайте над ней, распечатайте ее, прочитайте следующую строку, промойте, повторите), вам потребуются одинаковые объемы памяти. Кстати, вас может заинтересовать [Unix4j] (https://code.google.com/p/unix4j/). – Wintermute