大家好,我一直在使用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 \ insrsid10116111A
} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid5071958dresse
} {\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \ insrsid10116111 lient> \ lineC
} {\ 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
格式。