请在下面的代码片段中解释编译器的行为。考虑文本文件包含以下文本TOBE,相应的字节值为84,79,66,69
for(int i=0;i<4;i++){
byte inByte=(byte) buffInputFile.read();
system.out.println(inByte);
}
当我运行此片段时,我得到以下输出 84 79 66 69
但是当我在for循环中进行调整并进入内部时。 buffInputFile.read()首先显示84,当分配给inByte时它是79.我得到的输出是
79,66,69,13(13是回车)。
答案 0 :(得分:3)
我怀疑你有一个buffInputFile.read()
的调试器监视表达式 - 它正在从流中读取值以显示它......但是当执行该方法时该值不可用< em>作为代码的一部分。您已从流中读取该字节,因此下一次调用read()
将读取 next 字节,完全按照预期的那样。
一般来说,在调试器中执行带副作用的方法是一个非常糟糕的主意 - 这会引起这种混乱。如果您只是在赋值后在行上设置断点,则可以通过这种方式查看值。
简而言之:这根本不是编译器行为 - 这就是你使用调试器的方式。
答案 1 :(得分:1)
这不是一个错误,它是一个功能。 read
方法返回流中的下一个字节,并将内部标记设置为下一个位置。
当您使用调试器检查buffInputFile.read()
时,您可以有效地调用该方法,并且调试器会显示实际值。 但是标记已设置为下一个位置,因此inByte
将从流中接收下一个值。