Java文件写入问题:返回PrintWriter后写入不生效的解决办法
问题分析与解决方案
嘿,我一眼就瞅出问题所在了——你在WriteToFile()方法的finally块里提前关闭了流!当方法执行到finally时,不管try块里有没有正常返回,都会调用out.close(),这会把底层的BufferedWriter和FileWriter一起关掉。等你在主方法拿到这个PrintWriter对象的时候,它早就是关闭状态了,这时候再调用writer.println(),自然啥内容都写不进文件里。
为啥内部写入能正常工作?
当你把out.println()放在方法内部时,写入操作是在流关闭前完成的。关闭流的时候,PrintWriter会自动把缓冲区里的内容flush到文件里,所以能正常生效。但把写入逻辑移到外面后,流已经被提前关闭,所有后续操作都无效了。
快速修复方案:把流的关闭权交给调用方
你需要修改WriteToFile()方法,去掉finally里的流关闭逻辑,让调用方在写完内容后负责关闭流。同时优化下异常处理:
private static PrintWriter getAppendablePrintWriter() { try { FileWriter fw = new FileWriter("smrud.txt", true); BufferedWriter bw = new BufferedWriter(fw); return new PrintWriter(bw); } catch (IOException e) { e.printStackTrace(); // 你也可以根据业务需求返回null或者抛出异常 return null; } }
然后在主方法里使用的时候,记得用完要关闭流——推荐用Java 7+的try-with-resources语法,它会自动帮你关闭资源,更安全省心:
// 推荐写法:try-with-resources自动管理流 try (PrintWriter writer = getAppendablePrintWriter()) { if (writer != null) { writer.println("the text2"); // 这里可以加更多写入操作 } } // 如果你用的是Java 6及以下,就手动关闭 PrintWriter writer = getAppendablePrintWriter(); if (writer != null) { try { writer.println("the text2"); } finally { writer.close(); } }
进阶优化:封装成工具类管理流
如果需要频繁写入同一个文件,你可以封装一个简单的工具类,复用同一个PrintWriter实例,避免重复创建流,同时确保流能被正确关闭:
public class FileAppender { private PrintWriter writer; // 打开文件,准备追加写入 public boolean open(String filePath) { try { FileWriter fw = new FileWriter(filePath, true); BufferedWriter bw = new BufferedWriter(fw); writer = new PrintWriter(bw); return true; } catch (IOException e) { e.printStackTrace(); return false; } } // 写入一行文本 public void writeLine(String text) { if (writer != null) { writer.println(text); // 如果需要立即把内容刷到文件(而不是等缓冲区满),可以加这句 // writer.flush(); } } // 关闭流,释放资源 public void close() { if (writer != null) { writer.close(); } } }
使用这个工具类的方式也很简单:
FileAppender appender = new FileAppender(); if (appender.open("smrud.txt")) { try { appender.writeLine("第一次写入"); appender.writeLine("第二次写入"); // 可以执行N次写入操作,不用重复创建流 } finally { appender.close(); // 最后一定要关闭 } }
这样既满足了你“避免重复创建流”的需求,又能安全地管理流的生命周期,多次写入也很方便。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

