对java的io操作:关于写入文件是否以追加形式写入

该程序是为了通过学号统计打卡次数;
realsum为打卡次数---------------
思路:1.通过两个hashmap:repeat和map,repeat是用来(去重)fir;map是记录已经写入的数据且,key为学号,value为Sed类 ,在后面会将demo的数据加到map中
2.先循环读入demo的数据,数据会存放在fir的数组中,然后读入xieru的数据,数据会存放在sed数组中
3.将demo中的数据加入到xieru的数据中;其中会判断repeat(该学号)是否已经存在于map的(key)
4如果存在就直接让map(value中的realsum++);如果不存在那么将repeat的value(学号)作为key,fir【i】作为value加入到map

如果写入文件以覆盖的方式写入:在进行对(xieru)文件读写的while循环会直接跳过。这是为什么
如果写入文件以追加的方式写入:那么程序正常

问题:
如果写入文件以覆盖的方式写入:在进行对(xieru)文件读写的while循环会直接跳过。这是为什么
如果写入文件以追加的方式写入:那么程序正常

import java.io.*;
import java.util.HashMap;

//class Sed {
// public String name;//姓名
// public String no;//学号
//}

class Sed {
public String name; //姓名
public String no; //学号
public String sum;
public int realsum=0; //打卡次数
}

public class tongji {
public static void main(String[] args) throws IOException {
//创建两个hashtable;repeat记录demo的;map记录已经写入的(xieru文件的数据)
HashMap<String, String> repeat = new HashMap<String, String>();
HashMap<String, Sed> map = new HashMap<String, Sed>();

    Sed[] fir = new Sed[10000];
    Sed[] sed = new Sed[10000];
    for (int i = 0; i < fir.length; i++) {
        fir[i] = new Sed();
        sed[i] = new Sed();
    }
    int n = 0, k = 0;
    String line=new String();
    String demoFilePath = "D:\\demo.txt";
    String destFilePath = "D:\\xieru.txt";
    //写入
    BufferedReader demoBi = null;
    BufferedReader destBi = null;
    BufferedWriter bf = null;
    try {
        demoBi = new BufferedReader(new FileReader(demoFilePath));
        destBi = new BufferedReader(new FileReader(destFilePath));
        bf = new BufferedWriter(new FileWriter(destFilePath,true));

        //读入demo文件的数据
        while ((line = demoBi.readLine()) != null) {
            fir[n].name = line.substring(0, line.indexOf(" "));
            fir[n].no = line.substring(line.indexOf(" ") + 1, line.indexOf(" ") + 10);
            fir[n].realsum = 0;
            System.out.println(fir[n].name + " " + fir[n].no);
            repeat.put(fir[n].no, fir[n].no);
            n++;
        }

        Sed res = new Sed();
        //读入xieru文件的数据
        while ((line = destBi.readLine()) != null) {
            sed[k].name = line.substring(0, line.indexOf(" "));
            System.out.println(sed[k].name);
            sed[k].no = line.substring(line.indexOf(" ") + 1, line.indexOf(" ") + 10);
            System.out.println(sed[k].no);
            sed[k].sum = line.substring(line.indexOf(" ") + 11, line.length());
            System.out.println(sed[k].sum);
            sed[k].realsum = Integer.parseInt(sed[k].sum);

// System.out.println("lll");
res = sed[k];
map.put(sed[k].no, res);
k++;
}

        //将demo中的数据 加 到xieru中
        Sed flag=new Sed(), flag1=new Sed();
        for (int i = 0; i < repeat.size(); i++) {
            if (k == 0) {
                ++fir[i].realsum;
                map.put(repeat.get(fir[i].no), fir[i]);
            } else if(k!=0) {
                flag = map.putIfAbsent(repeat.get(fir[i].no), fir[i]);     //如果map中不存在repeat<>则加入,否则不加入
                if (flag != null) {         //不为null 说明 map中存在了,那么次数直接realsum++;
                    flag1 = map.get(repeat.get(fir[i].no));

                    ++flag1.realsum;
                    map.replace(repeat.get(fir[i].no), flag1);

                }else if (flag==null){      //flag为null 说明maop中不存在,那么要先让加入map.put(repeat.get(fir[i].no)),且realsum++;
                    flag=fir[i];
                    flag.realsum++;
                    map.put(flag.no,flag);
                }
            }
        }

        //写入
        for (String key : map.keySet()) {
            flag = map.get(key);
            line = flag.name + " " + flag.no + " " + flag.realsum;
            bf.write(line);
            bf.newLine();
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        bf.close();
        destBi.close();
        demoBi.close();
        System.out.println("更新成功");
    }
}

}

是不是文件已被占用导致直接跳过了