Java文件写入问题:Test类写入abc.txt失败及路径异常咨询
问题分析与解决方案
先帮你拆解两个问题的核心原因:
- 第一个代码没生效但无异常:你用的
BufferedWriter和PrintWriter都是带缓冲的流——它们会把数据暂时存在内存缓冲区里,只有缓冲区满、手动调用flush(),或者关闭流时,才会把数据真正写入文件。你的代码只创建了流却没做flush/close操作,数据一直留在缓冲区,自然看不到文件更新,也不会触发IO异常。 - 改成
/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
相关产品推荐
相关产品推荐

