Java:从 getResourceAsStream 中读取的字节太多
Java: Reading from getResourceAsStream gets too many bytes
我正在尝试使用 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”。
也许它试图以某种方式转换 to/from UTF-8?这里的一切都应该是二进制的。没有涉及文字。
感谢任何帮助。
编辑:我很确定我正在阅读正确的文件。如果我重命名文件,读取失败。改回来,有效。我在intellij中改了资源名,它在代码中重构改了名,依然有效
Edit2:我错了。我没有查看正确的文件。我追踪到 getResourceAsStream。我们的构建系统将文件复制到构建输出目录,然后从那里 运行s.. 这个目标文件的大小不对,所以看起来副本造成了一些损坏。
请注意,每当我更改名称时,它都会再次复制文件,这就是为什么我认为我拥有正确的文件。
我怀疑您在将文件作为资源读取时实际上读取的是不同版本的文件。 JVM 读取类加载器定位的资源。因此,当您将相同的 path
字符串解析为资源和文件时,它们很有可能解析为不同的东西。
我怀疑根本问题是 Unicode 还是 UTF-8。您的示例表明您正在使用 InputStream
读取状态。这种方法是编码不可知的......并且会为您提供文件中的原始字节。常规 InputStream
不会 尝试 解码它读取的字节。
话虽如此,您正在读取的字节不同肯定很重要。但这也与简单地读取不同的文件一致。
我正在尝试使用 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”。
也许它试图以某种方式转换 to/from UTF-8?这里的一切都应该是二进制的。没有涉及文字。
感谢任何帮助。
编辑:我很确定我正在阅读正确的文件。如果我重命名文件,读取失败。改回来,有效。我在intellij中改了资源名,它在代码中重构改了名,依然有效
Edit2:我错了。我没有查看正确的文件。我追踪到 getResourceAsStream。我们的构建系统将文件复制到构建输出目录,然后从那里 运行s.. 这个目标文件的大小不对,所以看起来副本造成了一些损坏。
请注意,每当我更改名称时,它都会再次复制文件,这就是为什么我认为我拥有正确的文件。
我怀疑您在将文件作为资源读取时实际上读取的是不同版本的文件。 JVM 读取类加载器定位的资源。因此,当您将相同的 path
字符串解析为资源和文件时,它们很有可能解析为不同的东西。
我怀疑根本问题是 Unicode 还是 UTF-8。您的示例表明您正在使用 InputStream
读取状态。这种方法是编码不可知的......并且会为您提供文件中的原始字节。常规 InputStream
不会 尝试 解码它读取的字节。
话虽如此,您正在读取的字节不同肯定很重要。但这也与简单地读取不同的文件一致。