0

commons.io.IOUtils为什么使用get时结果不一样byte[]

方法toByteArray参数是Inputstream和。Reader

String file = "c:/c.pdf";

try (InputStream is = new FileInputStream(file)) {
    byte[] result = IOUtils.toByteArray(is);
    System.err.println(Arrays.toString(result));
} catch (Exception e) {
    e.printStackTrace();
}

try (Reader reader = new FileReader(file)) {
    byte[] result = IOUtils.toByteArray(reader,"gbk");
    System.err.println(Arrays.toString(result));
} catch (Exception e) {
    e.printStackTrace();
}
4

1 回答 1

0

简短回答:两个结果不同,因为第二个解决方案是错误的。永远不要使用 aReader来读取二进制数据。

AnInputStream读取文件的字节而不试图赋予它们任何意义;aReader相反,尝试使用特定字符集将它们转换为字符:您的第二个示例读取字节,将它们转换为字符,然后该toByteArray()方法将这些字符转换回字节但是这种双重转换不仅没有用(很明显),而且完全错误,因为第一次转换可能会失败:当 Reader 遇到没有关联字符的字节(或在 GBK 等多字节字符集的情况下为一组字节)时,它会返回一个问号字符,并且当您将这些问号转换回来时到字节,您将获得与问号相对应的字节值,而不是转换失败的原始值。

所以问题不在于IOUtils,而在于您使用 Reader 来阅读 PDF。

于 2019-01-15T13:46:58.200 回答