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