【发布时间】:2022-01-24 03:10:13
【问题描述】:
我正在尝试使用 getResourceAsStream 读取二进制文件。问题是我得到了太多字节。根据 ls,该文件长 56374 字节,但是当我在代码中读取它时,我始终得到 85194 字节。
InputStream fileData = checkNotNull(MyClass.class.getResourceAsStream(path));
byte [] b = IOUtils.toByteArray(fileData);
int count = b.length;
我用类似的代码得到相同的结果:
InputStream fileData = checkNotNull(MyClass.class.getResourceAsStream(path));
byte [] b = new byte[1000*1000];
int count = fileData.read(b);
如果我在没有资源的情况下运行代码,一切都很好,我得到了正确的字节数。
FileInputStream fis = new FileInputStream(path);
byte [] b = new byte[1000*1000];
int count = fis.read(b);
我读取的数据的第一个字节匹配。检查输出,第一个不匹配的字节是“CO”,输出为“ef bf bd”。
也许它试图以某种方式与 UTF-8 进行转换?这里的一切都应该是二进制的。不涉及文本。
任何帮助表示赞赏。
编辑:我很确定我正在阅读正确的文件。如果我重命名文件,则读取失败。改回来,就可以了。我在intellij中更改了资源名称,它在代码中重构并更改了名称,仍然有效。
Edit2:我错了。我没有查看正确的文件。我追踪到 getResourceAsStream。我们的构建系统将文件复制到构建输出目录,然后从那里运行。这个目标文件的大小错误,所以看起来副本正在造成一些损害。
请注意,每当我更改名称时,它都会再次复制文件,这就是为什么我认为我有正确的文件。
【问题讨论】:
标签: java utf-8 classloader