二维数组循环中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
相关产品推荐
相关产品推荐

