使用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"); } } }
解决方案
核心问题是:直接追加或覆盖文件无法实现指定行修改,必须先读取文件全部内容到内存,修改对应行后再写回。
具体实现步骤
- 定义每种模式对应的行位置:每个模式占2行,模式
spielModus的起始行索引为(spielModus - 1) * 2(Java中列表索引从0开始,对应文件的第起始行+1、起始行+2)。 - 读取文件所有行到
List<String>,如果文件行数不足8行(4种模式×2行),补充空行填充。 - 修改对应模式的两行内容:第一行写分数,第二行写玩家名称。
- 将修改后的所有行写回文件(覆盖原文件)。
修改后的代码(替换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
相关产品推荐
相关产品推荐

