Java FileInputStream.read()跳过字节



我使用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,并返回由这些字节表示的单个char

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


1-实际行为取决于FileReader使用的字符编码。例如,如果编码为UTF-8,那么大于0x7f的字节将被视为多类型字符的一部分。如果您读取任意二进制数据,就好像它是UTF-8编码的文本一样,那么结果很可能是垃圾。当然,我预计补偿是";关闭">

最新更新