Java程序调用Thread.sleep后BufferedWriter无法写入文件求助
问题分析与解决办法
嘿,这个问题我太熟悉了!你遇到的是BufferedWriter缓冲机制导致的典型问题,咱们一步步拆解:
核心原因
BufferedWriter的缓冲区特性:它会把你写入的数据先暂存在内存缓冲区中,不会立刻写到磁盘。只有满足以下三个条件之一,数据才会真正落地到文件:- 缓冲区被写满(默认大小是8192字节,你的"hello"远达不到这个阈值)
- 手动调用了
flush()方法强制刷盘 - 流被关闭的时候(
close()方法内部会自动触发flush())
你只调用了write()就直接sleep,数据一直躺在内存里,自然看不到文件有内容。
- 资源未正确关闭:你的代码里没有关闭
FileWriter和BufferedWriter,就算程序正常结束,JVM也不一定会主动帮你刷缓冲区;要是程序意外终止,数据直接就丢失了。 - 另外你代码里的while循环没写完,要是循环持续运行但一直不刷新,问题会一直存在。
修正后的代码示例
推荐用Java 7+支持的try-with-resources语法,它会自动帮你关闭流,不用手动写finally块,更安全简洁:
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class Threading { public static void main(String args[]) { String s = "hello"; // try-with-resources会自动关闭fw和bw,无需手动处理 try (FileWriter fw = new FileWriter("b.txt", true); // 第二个参数true表示追加写入,避免循环覆盖内容 BufferedWriter bw = new BufferedWriter(fw)) { while (true) { // 假设你需要无限循环写入 bw.write(s); bw.newLine(); // 加换行符,让每次写入的内容更清晰 bw.flush(); // 手动刷新缓冲区,确保数据立刻写入磁盘 Thread.sleep(5000); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 恢复线程中断状态 e.printStackTrace(); } } }
关键注意点
- 如果不需要追加写入,去掉
FileWriter的第二个参数true即可,但循环写入时会一直覆盖之前的内容,建议根据需求选择。 - 必须处理
IOException和InterruptedException,避免程序因未捕获异常直接终止。 - 要是不用try-with-resources,记得在finally块里按创建逆序关闭流(先关
bw,再关fw),确保资源释放:
finally { try { if (bw != null) bw.close(); if (fw != null) fw.close(); } catch (IOException e) { e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

