JAVA Files.readAllBytes()而不更改charset

时间:2015-08-20 18:21:27

标签: java encoding utf-8 character-encoding

我有一个包含一些我想要更改的纯文本的文件。但是,大多数文件对人类来说都是不可读的。

我最初使用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块文本,以便找到并替换该文件中的纯文本,然后再将其转换回字节数据,以便将所有这些解析为新文件。必须有一个更好的解决方案!

只是一个例子:

!7S€成为

!/ S“Ç-(包括连字符)以防万一它显示的内容与我上传的截图相同

enter image description here

1 个答案:

答案 0 :(得分:2)

如果文件只包含一些纯文本,并且大部分文本不打算作为字符读取,那么您应该只将文本的一部分用纯文本转换为String。将任意非文本字节转换为String确实非常不是一个好主意。

  

我很确定我可以"保持"完全相同的文件,如果我让我的应用程序读取它"逐字节"没有任何字符集,但后来我还必须将所有字节转换为UTF-8文本块,以便找到并替换该文件中的纯文本,然后再将其转换回字节数据以便解析所有这些都进入了新文件。必须有一个更好的解决方案!

然后你应该注意文件的实际格式。完全有可能是一些随机的字节块 - 视频或音频,如果文件是你说的MP4 - 只是随机匹配你正在寻找的文本。这并不意味着你应该改变那些字节。

如果您愿意接受这种风险,那么也许您应该将搜索文本转换为字节并搜索这些字节,而不是将您搜索的字节转换为文本。这意味着您无法使用replaceAll;你必须为字节实现自己的替换实现。但是,这仍然可能更正确。