为什么通用io工具IOUtils.toByteArray不相同?

时间:2019-01-15 07:45:13

标签: character-encoding filereader ioutils

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

toByteArray方法参数是InputstreamReader

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();
}

1 个答案:

答案 0 :(得分:0)

简短的回答:这两个结果不同,因为第二种解决方案是错误的。永远不要使用<script> $('body').on('click', '#btnCancel', function (e) { alert(); $('#DivDatEntry').html(""); }); </script> 来读取二进制数据。

Reader读取文件的字节时不尝试赋予它们任何含义;相反,InputStream尝试使用特定的字符集将其转换为字符:您的第二个示例读取字节,将其转换为字符,然后Reader方法将这些字符转换回字节,但此两倍转换不仅无效(显而易见),这是很错误的,因为第一次转换可能会失败:当Reader遇到一个字节(如果是GBK等多字节字符集,则为一组字节)时,没有相关的字符,它将返回一个问号字符,当您将这些问号转换回字节时,将得到与问号相对应的字节值,而不是未能通过转换的原始值。

因此问题不在toByteArray()中,而是在您使用Reader读取PDF时出现的。