Очевидно, что файл содержит RTF, форматированный текст вместо простого текста - как уже предлагалось в окончании файла .rtf.Также \rtlch
, вероятно, означает символы справа налево.Для чтения файла вы можете использовать StyledDocument
, RTFEditorKit из Swing.
Path path = Paths.get("C:\\files\\myfile.rtf");
byte[] content = Files.readAllBytes(path);
String rtf = new String(content, StandardCharsets.ISO_8859_1);
StringReader in = new StringReader(rtf);
RTFEditorKit kit = new RTFEditorKit();
Document doc = kit.createDefaultDocument();
kit.read(in, doc, 0);
String text = doc.getText(0, doc.getLength());
Код немного пошаговый, его можно сразу прочитать, как вы это сделали.
Запись текста обратно в файл:
Проблема заключается в природе RTF.Как вы уже видели, «CivClient» разделен посередине с различными атрибутами RTF, самое простое решение - создать правильный RTF вручную.Удалите мусор в слове.
Тогда ваш код будет работать:
Path path = Paths.get("C:\\files\\myfile.rtf");
byte[] content = Files.readAllBytes(path);
String str = new String(content, StandardCharsets.ISO_8859_1);
str = str.replace("CivClient", "myname");
str = str.replace("AdresseClient", "myname");
str = str.replace("lastname", "myname");
str = str.replace("firstname", "myname");
content = str.getBytes(StandardCharsets.ISO_8859_1);
Files.write(path, content);
ISO-8859-1, Latin-1, это ограниченный набор символов.Использование поддержки UTF-16 в RTF:
str = str.chars()
.map(ch -> ch < 128 ? Character.toString(ch) : String.format("\\u%04X", (int)ch))
.collect(Collectors.joining(""));
, которая преобразует специальные символы в формат \uXXXX
.