Java reader.readLine () не возвращает точную строку в файле - PullRequest
0 голосов
/ 05 марта 2019

Привет, ребята, я использовал BufferedReader, и на самом деле я не заметил этой проблемы, пока не нашел несколько слов, я пытаюсь заменить некоторые слова в моем файле, и я столкнулся с тем, что этим методом я не получаю Точный результат, который я ожидаю, это та же строка в файле, это мой код там

BufferedReader reader = new BufferedReader(
               new InputStreamReader(
                          new FileInputStream("C:\\files\\myfile.rtf"), StandardCharsets.ISO_8859_1));
    PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream("C:\\files\\my2file.rtf")));
    String str;

    while ((str = reader.readLine()) != null) {
        System.out.println(str);

    str = str.replace("CivClient", "myname"); // doesn't work
    str = str.replace("AdresseClient", "myname"); // doesn't work
    str = str.replace("lastname", "myname");
    str = str.replace("firstname", "myname");

    }
    writer.close();
    reader.close();

выполняя этот код, я обнаружил, что слово "CivClient" не отображается как есть, а отделено это часть журнала, а не все. Вы заметите, что слово не появляется как есть. благодарю вас за ваше усилие. Уважаемые стекировщики.

VOS PRESTATIONS \ ~: \ line <} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid5071958 C} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111 iv} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid5071958 <code>C} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111 lient> <} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid13635392 \ charrsid13635392 <code>lastname} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111> <} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid13635392 \ charrsid13635392 <code>firstname} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111> \ line <} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid5071958 <code>A} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111 dresse} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid5071958 C} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111 lient> \ line <} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid13635392 <code>CPClient} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111> <} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid13635392 VilleClient} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111>

Ответы [ 2 ]

3 голосов
/ 05 марта 2019

Очевидно, что файл содержит 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.

0 голосов
/ 05 марта 2019

Это либо похоже на исходный файл, либо ваша попытка «перезаписать на месте» путем потоковой передачи ввода при записи в тот же файл вызывает эту проблему. Как правило, запись в новый файл, а когда вы закончите, переместите новый файл поверх старого файла (после закрытия всех потоков). В качестве альтернативы используйте RandomAccessFile и перезаписывайте на месте, но учтите, что для перезаписи на месте нельзя удалить или добавить символы (только заменить их). Это ограничение файловых систем, а не Java.

Примечание: вы читаете с принудительной кодировкой: ISO_8859_1. Но при написании вы не делаете этого. Это означает, что в любой системе, в которой кодировка кодировки по умолчанию платформы не соответствует ISO_8859_1, это задание не только заменяет CivClient и символы «меньше», но и перекодирует всю кодировку, возможно, вы захотите это исправить.

...