Java java.util.regex.Matcher
replaceFirst(...)
/replaceAll(...)
API zwraca ciągi znaków, które (przy użyciu domyślnego rozmiaru sterty) mogą również spowodować KILKA dla danych wejściowych tak dużych jak 20-50M znaków. Te 2 metody można z łatwością przepisać na write na Writer
s zamiast konstruować ukłucia, skutecznie eliminując jeden punkt awarii.Java: zastąpienie regex w dużych plikach
Matcher
jest factory method jednak tylko przyjmuje CharSequence
S, która również może wyrzucać OOME w przypadku korzystania z String
StringBuffer
S/S/StringBuilder
s.
Jak mogę zawinąć java.io.Reader
zaimplementować interfejs CharSequence
(biorąc pod uwagę fakt, że moje wyrażenia regularne mogą zawierać odwołania wstecznego)? Czy istnieje inne rozwiązanie, które może zastąpić wyrazy regularne w plikach i nie jest OOME-podatne na duże nakłady?
Innymi słowy, w jaki sposób mogę zaimplementować funkcjonalność podobną do GNU sed
w Javie (jako że sed
radzi sobie z plikami o rozmiarach nawet kilku terabajtów, jednocześnie oferując taką samą obsługę rozszerzonych wyrażeń regularnych)?
Czy wystarczy zastąpić pojedynczą linię na raz, czy zastąpić "cały plik jednym zamiennikiem"? –
'Pattern.matcher()' nie tworzy nowego ciągu. Obiekt 'Matcher' stworzony po prostu przytrzymaj odnośnik do CharSequence przekazanego. – nhahtdh
' sed' obsługuje pliki na zasadzie line-by-line, co powoduje, że nie wymaga dużej ilości pamięci dla dużych plików (chyba że plik ma * bardzo * długie wiersze lub kod nakazuje mu zapamiętanie wielu rzeczy). Jeśli zrobisz to samo w Javie (czytać wiersz, pracować nad nim, drukować, czytać następną linię, płukać, powtarzać), będziesz potrzebował podobnej ilości pamięci. Przy okazji, możesz być zainteresowany [Unix4j] (https://code.google.com/p/unix4j/). – Wintermute