繁体   English   中英

JAVA Files.readAllBytes()而不更改字符集

[英]JAVA Files.readAllBytes() without changing charset

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

首先,我使用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” Ç—(包括连字符),以防万一,与我一样,我上传了屏幕截图

在此处输入图片说明

如果文件仅包含一些纯文本,并且大多数内容不打算作为字符读取,则应仅将具有纯文本的文件部分转换为String 实际上,将任意非文本字节转换为String确实不是一个好主意。

我很确定,如果我只是让我的应用程序按字节逐字节读取而没有任何字符集,那么我可以“保留”完全相同的文件,但是我还必须按顺序将所有字节转换为UTF-8文本块在将其再次转换为字节数据以便将所有这些信息解析为新文件之前,可以找到并替换该文件中的纯文本。 为此必须有更好的解决方案!

然后,您应该注意文件的实际格式。 如果您所说的文件是MP4,则完全有可能是随机的一些字节块(视频或音频),恰好随机地匹配了您要查找的文本。 这并不意味着您应该更改这些字节。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM