我使用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) ...
是什么原因造成的?此外,如何避免这种情况?
1条答案
按热度按时间6psbrbz91#
我认为问题是你实际上是在读一本书
Reader
,不是InputStream
. 当然,这就是你在向我们展示的代码中所做的!一
Reader.read()
调用将消耗一个或多个字节1并返回单个字节char
由这些字节表示的。解决方法:不要使用
Reader
读取二进制文件。使用InputStream
或者是一些InputStream
.1-实际行为取决于
FileReader
使用。例如,如果编码是utf-8,则大于0x7f的字节将被视为多类型字符的一部分。如果将任意二进制数据当作utf-8编码的文本来读取,则结果很可能是垃圾。当然,我希望补偿是“关闭”。