java中FileInputStream中遇到的问题

问题遇到的现象和发生背景

编写代码没有按预期输出adcde

问题相关代码,请勿粘贴截图
public class FISRead {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("read.txt");
        while(fis.read()!=-1){
            System.out.println((char)fis.read());
        }
        fis.close();
    }
}

运行结果及报错内容

b
d

我的解答思路和尝试过的方法

我尝试过以下代码可以得到预期结果

public class FISRead {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("read.txt");
        int b;
        while((b=fis.read())!=-1){
            System.out.println((char)b);
        }
        fis.close();
    }
}


我想要达到的结果

我想知道是为什么造成了这种结果

l第一段代码里,while循环里读取的值没打印啊,循环体里又读一次才打印,相当于把a和c跳过了,输出结果就是b和d。第二段代码就对了,把读出来的值存放到变量后打印

fis.read()方法是读取下一行数据,并返回该行数据。如果你再次调用它就会读取下一行(也就是第二行)。第一段代码中,你取出a做了while判断,输出的时候再次使用fis.read()读取出来的实际上是b。如此循环最后结果就是bd,如果文件中再加个 f 的话,那结果大概就是 bdf 了

img

改成下边这种方式,因为每次read会移动指针,while判断的那一次移动指针被你跳过了没有输出

read方法每次都取一个一个字节的数据,read方法的逻辑就像是喝水,杯子里的一杯水,每喝掉一口就少一口,相当于read方法每读取一次,流中的数据就取出来一点,所以你两次读取的结果肯定是不一样的