gpt4 book ai didi

java - 基于5000字节分割文件

转载 作者:行者123 更新时间:2023-12-02 10:05:37 30 4
gpt4 key购买 nike

我已经根据下面的代码分割了文件,

    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 个字节并将其粘贴到 Notepad++ 中时,我开始显示相同的数据超过 3072 个字节。您能帮我解决这个问题吗?

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

最佳答案

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

for (byte b : buffer) {

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

第二个问题是这条线容易破坏数据。

result += (char) b;

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

(您所做的唯一“有效”的情况是输入文件是 ASCII 或 LATIN-1 编码文本。)

这种损坏很可能会增加相对于输入流的字节数,尤其是在以 UTF-8 格式输出时。 128 到 255 范围内的任何输入字节在转换为 char 并随后以 UTF-8 编码时都将转换为 2 个字节。

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

关于java - 基于5000字节分割文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55355219/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com