Java FileInputStream.read() 跳过字节

Java FileInputStream.read() skips bytes

我正在使用 Java 的 FileInputStream.read() 一次读取一个二进制文件,并通过递增变量 i 来跟踪文件中的位置。我正在寻找一个特定的字符,对于二进制文件的第一部分,返回了正确的偏移量。

但是,在文件的后面,偏移量(由 i 发现)开始从文件中的实际偏移量开始减少。 (例如,0x4c5 处的字符被误读为 0x4c3。)因此,FileInputStream.read() 会跳过字节。逐渐地,i 变得明显小于实际文件偏移量(到最后,减少了 60 个字节)。

这是我的一些代码。

in = new FileReader(path);
int c = 0;
int i = -1;

while (c != -1) {
    i++;
    try {
        c = in.read();
        if (c == 0x47) {
            print("Found G at 0x" + Integer.toHexString(i));
        }
    } catch(IOException e) ...

这可能是什么原因造成的?此外,如何避免这种情况?

我认为问题在于您 实际上 Reader 而不是 InputStream 阅读。当然,这就是您在向我们展示的代码中所做的!

一个Reader.read()调用将消耗一个或更多字节1和return一个char 由那些字节表示。

解决方案:不要使用 Reader 来读取二进制文件。使用 InputStreamInputStream.

的某个子类

1 - 实际行为取决于 FileReader 使用的字符编码。例如,如果编码为 UTF-8,则大于 0x7f 的字节将被视为多类型字符的一部分。如果您读取任意二进制数据,就好像它是 UTF-8 编码文本一样,结果很可能是垃圾。当然,我希望偏移量是“关闭”的。