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

Java程序调用Thread.sleep后BufferedWriter无法写入文件求助

问题分析与解决办法

嘿,这个问题我太熟悉了!你遇到的是BufferedWriter缓冲机制导致的典型问题,咱们一步步拆解:

核心原因

  • BufferedWriter的缓冲区特性:它会把你写入的数据先暂存在内存缓冲区中,不会立刻写到磁盘。只有满足以下三个条件之一,数据才会真正落地到文件:
    1. 缓冲区被写满(默认大小是8192字节,你的"hello"远达不到这个阈值)
    2. 手动调用了flush()方法强制刷盘
    3. 流被关闭的时候(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:56:34