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

二维数组循环中BufferedWriter无法写入txt文件问题

问题分析与解决

你的代码之所以没往newbook.txt里写入内容,核心原因是BufferedWriter的缓冲区没有被刷新或关闭。

BufferedWriter是带缓冲的字符输出流,它会先把数据暂存在内存缓冲区中,只有满足以下条件之一时才会把数据写入磁盘文件:

  • 缓冲区被写满
  • 主动调用flush()方法强制刷新缓冲区
  • 调用close()方法关闭流(关闭前会自动触发flush)

你的代码里写完数据后,既没有刷新缓冲区,也没有关闭流,所以数据一直留在内存里,根本没写到文件里。

修复方案一:手动刷新并关闭流

在写完数据后,一定要调用flush()和close()方法,注意关闭顺序(先关外层流,BufferedWriter关闭时会自动关闭它包装的FileWriter):

try { 
    File file = new File("newbook.txt"); 
    FileWriter fw = new FileWriter(file, true); 
    BufferedWriter out = new BufferedWriter(fw); 
    // 这里的if判断其实多余,FileWriter在append模式下如果文件不存在会自动创建
    // if (!file.exists()) { 
    //     file.createNewFile(); 
    // } 
    for (int r = 0; r < StuGrades.length; r++) { 
        for (int c = 0; c < StuGrades[0].length; c++) { 
            out.write(" " + StuGrades[r][c]); 
        }
        // 建议每行结束加个换行,避免所有内容挤在一行
        out.newLine();
    } 
    // 强制刷新缓冲区,把内存中的数据写入文件
    out.flush();
    // 关闭流,释放系统资源
    out.close();
} catch(IOException e){ 
    // 打印完整异常栈信息,方便排查具体问题,比只输出提示更有用
    e.printStackTrace(); 
}

修复方案二:使用try-with-resources(推荐)

从Java 7开始,try-with-resources语法可以自动实现资源的关闭(包括自动触发flush),不需要手动调用close,代码更简洁也更安全(就算发生异常也能保证资源被正确释放):

// 把需要自动关闭的流声明在try的括号内
try (FileWriter fw = new FileWriter("newbook.txt", true);
     BufferedWriter out = new BufferedWriter(fw)) { 
    for (int r = 0; r < StuGrades.length; r++) { 
        for (int c = 0; c < StuGrades[0].length; c++) { 
            out.write(" " + StuGrades[r][c]); 
        }
        out.newLine();
    } 
    // 无需手动flush或close,try-with-resources会自动处理
} catch(IOException e){ 
    e.printStackTrace(); 
}

另外补充两个小细节优化:

  • 原代码里的file.createNewFile()是多余的,FileWriter在写入(包括append模式)时,如果目标文件不存在,会自动创建它。
  • 每次写完一行学生成绩后调用out.newLine(),可以让每行成绩单独占一行,提升文件内容的可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:41:14