Java 基于5000字节分割文件

Java 基于5000字节分割文件,java,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 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 server、eclipse,文件或字符串的格式为UTF-8字符集。

第一个问题是这一行中有一个错误:

for (byte b : buffer) {
假设缓冲区中的所有字节位置都包含数据。但是,如果read调用返回的字节数少于sizeOfFiles,该怎么办

第二个问题是该行容易损坏数据

result += (char) b;
您将获取输入的每个字节并将其转换为一个字符。但是如果输入文件是二进制的,那么这些字节并不代表字符。或者,如果输入是文本,则输入中的实字符可以例如编码为2个或更多字节。无论哪种方式,当您从字节强制转换为字符时,您都无法获得适当的Unicode代码单元来附加到字符串中

只有在输入文件是ASCII或拉丁1编码文本的情况下,您所做的工作才会起作用

这种混乱很可能会增加相对于输入流的字节数,特别是在以UTF-8输出时。当转换为字符,然后以UTF-8编码时,128到255范围内的任何输入字节将变成2字节


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

当我复制缓冲区中的前3072字节并将其粘贴到记事本中时++这部分是如何完成的?我已使用行分隔符打印了缓冲区结果,在第一个缓冲区后,它将画一条线。我已将行之间的数据粘贴到notepadd++中,您当前的代码中没有行分隔符,除非您的意思是\n,您能给我们展示一个使用此行分隔符的版本,它会出现相同的问题吗?请现在检查一下,我已将行包含在代码中。我已经在行间获取了数据并粘贴到记事本++Hi maran中,我的想法也是一样的,但是当我的数据复制到记事本中时,我得到的不仅仅是字节数,而且作为一个字符,由于多字节序列可能被缓冲读取拆分,一个字符的开头或结尾可能有半个字符。