根据5000字节分割文件

时间:2019-03-26 10:45:16

标签: java

我已根据以下代码分割了文件,

    int sizeOfFiles = 1024 * 3;// 1MB
    byte[] buffer = new byte[sizeOfFiles];

   // String fileName = f.getName();

    //try-with-resources to ensure closing stream
    try (ByteArrayInputStream fis = new ByteArrayInputStream(f);) {

        int bytesAmount = 0;
        int i=0;
        while ((bytesAmount = fis.read(buffer)) > 0) {

            String result="";
            for (byte b : buffer) {
                result+=(char)b;
            }

            System.out.println(result);

           System.out.print("--------------------------------------------------------");
        }
    }
}

但是,当我在缓冲区中复制前3072个字节并将其粘贴到记事本++中时,我发现相同的数据超过了3072个字节。 您能帮我解决这个问题吗?

注意:我使用的是Windows服务器,日食,文件或字符串的格式为UTF-8字符集。

1 个答案:

答案 0 :(得分:1)

第一个问题是此行中存在一个错误:

for (byte b : buffer) {

您假设buffer中的所有字节位置都包含数据。但是,如果read调用返回的字节数少于sizeOfFiles个,该怎么办?

第二个问题是该行易于处理数据。

result += (char) b;

您正在获取输入的每个字节并将其转换为字符。但是,如果输入文件是二进制文件,则这些字节不代表字符。可替代地,如果输入是文本,则输入中的实字符可以被编码为例如2个或更多个字节。无论哪种方式,当您从byte转换为char时,都无法获得正确的Unicode代码单元来追加到字符串中

(唯一要做的就是“工作”的情况是输入文件是ASCII或LATIN-1编码的文本。)

这种处理很可能会增加相对于输入流的字节数,特别是如果您使用UTF-8输出。在转换为char然后使用UTF-8进行编码时,范围在128到255之间的任何输入字节将转换为2个字节。

最后,当您使用println输出字符串时,将在每个缓冲区已满的数据之后添加一个额外的行分隔符。

相关问题