【问题标题】:Java FileInputStream.read() skips bytesJava FileInputStream.read() 跳过字节
【发布时间】:2020-12-13 06:25:04
【问题描述】:

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

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

【问题讨论】:

  • 对二进制文件使用 FileInputStream。
  • “我正在使用 Java 的 FileInputStream.read() 一次一个字节地读取二进制文件...” - 这不是您向我们展示的代码所做的。这可能是您的问题(IMO)的原因。如果没有,您需要向我们展示一个 minimal reproducible example,以证明您的真正问题。
  • 除非你正在阅读一个文本文件(阅读器是基于文本的)所以 c 可能是两个字节。

标签: java file-io binaryfiles


【解决方案1】:

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

Reader.read() 调用将消耗一个或更多字节1并返回由这些字节表示的单个char

解决方案:不要使用Reader 来读取二进制文件。使用InputStreamInputStream 的某个子类。


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

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多