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

Java文件写入问题:Test类写入abc.txt失败及路径异常咨询

问题分析与解决方案

先帮你拆解两个问题的核心原因:

  1. 第一个代码没生效但无异常:你用的BufferedWriter和PrintWriter都是带缓冲的流——它们会把数据暂时存在内存缓冲区里,只有缓冲区满、手动调用flush(),或者关闭流时,才会把数据真正写入文件。你的代码只创建了流却没做flush/close操作,数据一直留在缓冲区,自然看不到文件更新,也不会触发IO异常。
  2. 改成/abc.txt抛出异常:这个是系统根目录的绝对路径(比如Windows的C盘根、Linux的根目录),普通用户通常没有往系统根目录写文件的权限,所以会触发权限类IO异常。

下面给你几个实用的解决办法:

方案1:用try-with-resources自动管理流(推荐)

Java 7及以上支持这个语法,它会在代码块结束后自动关闭所有实现AutoCloseable接口的资源(包括你用到的这些流),不用手动写close,既安全又简洁:

public static void main(String[] args) {
    // 注意路径:如果abc.txt在Test类所在目录下的某个文件夹里,比如文件夹叫"fileDir",就写"fileDir/abc.txt"
    try (PrintWriter pWriter = new PrintWriter(new BufferedWriter(new FileWriter("fileDir/abc.txt")))) {
        pWriter.println("Hello World!");
        // 无需手动flush/close,try-with-resources会自动处理
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

方案2:手动关闭流(适配Java 7以下版本)

如果是老版本Java,记得在finally块里手动关闭流(close操作会自动触发flush):

public static void main(String[] args) {
    PrintWriter pWriter = null;
    try {
        pWriter = new PrintWriter(new BufferedWriter(new FileWriter("fileDir/abc.txt")));
        pWriter.println("Hello World!");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        if (pWriter != null) {
            pWriter.close(); // 关闭时自动刷出缓冲区数据
        }
    }
}

路径相关的小提示

  • 不确定当前工作目录?可以用System.out.println(System.getProperty("user.dir"));打印出来,相对路径就是基于这个目录的。
  • 避免硬编码绝对路径:不同系统的绝对路径格式不一样,可通过类加载器获取项目内的文件路径,比如:
    // 获取Test类所在目录下fileDir文件夹里的abc.txt路径
    String filePath = Test.class.getResource("fileDir/abc.txt").getPath();
    // 用这个路径创建FileWriter即可
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:34:13