大家好,我一直在使用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”一词并没有出现,而是分开了
这是日志的一部分,而不是全部。您会注意到该词没有按原样出现。
感谢你的付出。亲爱的stackoverflowers。


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

最佳答案

显然,该文件包含RTF,富文本格式而不是纯文本格式-正如已经建议的.rtf文件结尾。同样,\rtlch可能表示从右到左的字符。您可以使用swing的StyledDocument RTFEditorKit读取文件。

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(拉丁文1)是受限制的字符集。在RTF中利用UTF-16支持:

str = str.chars()
    .map(ch -> ch < 128 ? Character.toString(ch) : String.format("\\u%04X", (int)ch))
    .collect(Collectors.joining(""));


将特殊字符转换为\uXXXX格式。

09-26 12:32