我有一个文件,其中包含一些我想要更改的纯文本。然而,该文件的大部分内容对于人类来说是无法读取的。
我首先使用UTF-8作为字符集,它找到了我想要替换的文本,正确地替换/更改了它并将所有这些写入到一个新文件中。但我遇到了两个问题:大小几乎是原始文件的两倍,而且其他应用程序也无法读取它。然后我尝试使用 ISO-8859-1 进行相同的操作,这导致文件大小比 UTF-8 更接近原始文件 - 但使用计划文本编辑器打开并比较文件表明 ISO-8859-1 也“被误解”,因此向文件中添加了一些字节。对于能够打开原始文件 (MP4) 的应用程序来说,该文件也无法读取
我所做的如下:
String content;
try {
content = new String(Files.readAllBytes(path), ("ISO-8859-1"));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
content = content.replaceAll("\"enabled\": false", "\"enabled\": true");
try {
Files.write(pathDestination, content.getBytes("ISO-8859-1"));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
我很确定,如果我只是让我的应用程序在没有任何字符集的情况下“逐字节”读取它,我可以“保留”完全相同的文件,但随后我还必须将所有字节转换为 UTF-8 block text 以便查找并替换该文件中的纯文本,然后再次将其转回字节数据以便将所有这些解析到新文件中。必须有更好的解决方案!
仅举一个例子:
!7S€ÇŸ 变为
!/S”Ç—(包括连字符),以防万一它的显示与我上传的屏幕截图相同
最佳答案
如果文件仅包含一些纯文本,并且其中大部分内容不打算作为字符读取,那么您应该只将文件中纯文本的部分转换为 String
。将任意非文本字节转换为 String
确实不是一个好主意。
I am pretty sure I could "keep" the exact same file if I just made my application read it "byte by byte" without any charsets, but then I also would have to convert all the bytes into blocks of UTF-8 text in order to find and replace the plain text in that file, just before turning it back into byte-wise data again in order to parse all this into the new file. There must be a better solution for this!
那么您应该注意文件的实际格式。完全有可能某些随机字节 block (视频或音频,如果文件是 MP4,如您所说)只是随机地与您正在查找的文本匹配。这并不意味着您应该更改这些字节。
如果您愿意接受这种风险,那么也许您应该将搜索文本转换为字节并搜索这些字节,而不是将要搜索的字节转换为文本。但这意味着您不能使用 replaceAll
;您必须实现自己的字节替换实现。不过,这可能仍然更正确。
关于JAVA Files.readAllBytes() 不更改字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125579/