我已根据以下代码分割了文件,
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字符集。
答案 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
输出字符串时,将在每个缓冲区已满的数据之后添加一个额外的行分隔符。