You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BufferedWriter写入文件指定行时如何避免覆盖原有内容?

问题

游戏需要将高分优先存入数据库,失败则临时保存到文件:每种模式固定对应文件中连续两行(模式1对应第1、2行,模式2对应第3、4行,以此类推)。现有代码在写入模式2内容时,会覆盖模式1的原有内容,或导致原有行变为空白,无法实现指定行写入且保留其他内容。

附原有代码:

public static void saveHighscoreToDatabase(int spielModus, String nameHighscoretraeger, int score){
        try {
            Connection connection = DriverManager.getConnection(url, user, password);
            String sql = null;
            if (spielModus == 1){
                sql = "INSERT INTO HighscoreLeicht (`Name`, `Score`) VALUES (?,?)";
            }else if (spielModus == 2){
                sql = "INSERT INTO HighscoreMittel (`Name`, `Score`) VALUES (?,?)";
            }else if (spielModus == 3){
                sql = "INSERT INTO HighscoreSchwer (`Name`, `Score`) VALUES (?,?)";
            }else if (spielModus == 4){
                sql = "INSERT INTO HighscoreModus (`Name`, `Score`) VALUES (?,?)";
            }
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,nameHighscoretraeger);
            statement.setInt(2, score);
            statement.execute();
            connection.close();
        } catch (SQLException e) {
            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter("....SaveFile.txt",true));
                if (spielModus == 1){
                    bw.write(String.valueOf(score));
                    bw.newLine();
                    bw.write(nameHighscoretraeger);
                    bw.close();
                }else if (spielModus == 2){
                    bw.newLine();
                    bw.newLine();
                    bw.write(String.valueOf(score));
                    bw.newLine();
                    bw.write(nameHighscoretraeger);
                    bw.close();
                }else if (spielModus == 3){

                }else if (spielModus == 4){

                }
            }catch (Exception e2){
                System.out.println("Error");
            }
        }
}

解决方案

核心问题是:直接追加或覆盖文件无法实现指定行修改,必须先读取文件全部内容到内存,修改对应行后再写回。

具体实现步骤

  1. 定义每种模式对应的行位置:每个模式占2行,模式spielModus的起始行索引为(spielModus - 1) * 2(Java中列表索引从0开始,对应文件的第起始行+1、起始行+2)。
  2. 读取文件所有行到List<String>,如果文件行数不足8行(4种模式×2行),补充空行填充。
  3. 修改对应模式的两行内容:第一行写分数,第二行写玩家名称。
  4. 将修改后的所有行写回文件(覆盖原文件)。

修改后的代码(替换catch块内的逻辑)

catch (SQLException e) {
    String filePath = "SaveFile.txt"; // 修正路径,去掉多余的点
    File file = new File(filePath);
    List<String> lines = new ArrayList<>();

    // 1. 读取现有文件内容,不足则补空行
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            lines.add(line);
        }
        // 确保至少有8行(4种模式×2行)
        while (lines.size() < 8) {
            lines.add("");
        }
    } catch (Exception readEx) {
        // 文件不存在或读取失败,初始化8个空行
        for (int i = 0; i < 8; i++) {
            lines.add("");
        }
    }

    // 2. 修改对应模式的行
    int startLine = (spielModus - 1) * 2;
    if (startLine >= 0 && startLine + 1 < lines.size()) {
        lines.set(startLine, String.valueOf(score));
        lines.set(startLine + 1, nameHighscoretraeger);
    }

    // 3. 将修改后的内容写回文件
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
        for (String line : lines) {
            bw.write(line);
            bw.newLine();
        }
    } catch (Exception writeEx) {
        System.out.println("写入临时文件失败: " + writeEx.getMessage());
    }
}

关键说明

  • 使用try-with-resources自动关闭流,避免资源泄漏。
  • 先确保文件内容有足够的空行,避免索引越界。
  • 通过List.set()修改指定位置的内容,精准控制每行的内容,不会覆盖其他行。
  • 修正了原代码中FileWriter路径的错误(去掉多余的....)。

内容的提问来源于stack exchange,提问作者Cedric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:27:54