java fileinputstream.read()跳过字节

soat7uwm  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(435)

我使用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) ...

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

6psbrbz9

6psbrbz91#

我认为问题是你实际上是在读一本书 Reader ,不是 InputStream . 当然,这就是你在向我们展示的代码中所做的!
Reader.read() 调用将消耗一个或多个字节1并返回单个字节 char 由这些字节表示的。
解决方法:不要使用 Reader 读取二进制文件。使用 InputStream 或者是一些 InputStream .
1-实际行为取决于 FileReader 使用。例如,如果编码是utf-8,则大于0x7f的字节将被视为多类型字符的一部分。如果将任意二进制数据当作utf-8编码的文本来读取,则结果很可能是垃圾。当然,我希望补偿是“关闭”。

相关问题