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

Java文件创建运行原理及实操代码两处异常问题咨询

问题解答

问题1:原有文件内容被清空覆盖的原因

  • 你使用的new FileWriter(File input)是默认的覆盖模式构造方法,调用该构造时,JVM会请求操作系统以「截断写入」的权限打开文件,操作系统在打开文件的瞬间就会清空原有文件的全部内容,将文件指针定位到文件起始位置,和后续写入多少内容无关。
  • 你之前的测试结论是对的,确实不是「边写边覆盖」,但也不是你猜测的写入时才处理,而是打开文件的第一步就已经清空了原有内容,所以哪怕你后续只写1个字符,原有内容也不会保留。
  • 如果需要在原有内容末尾追加写入,改用带append参数的构造即可:new FileWriter(input, true),第二个参数传入true就不会清空原有内容。

问题2:新建文件获取路径抛出空指针的原因

  • Class.getResource()是从JVM运行时的**类路径(classpath)**下加载资源,不是直接从源码目录读取文件。标准Maven/Gradle项目中,src/test/resources是资源源码目录,该目录下的文件只有在项目执行构建的process-test-resources阶段时,才会被复制到编译输出的类路径目录(默认是target/test-classes),运行时代码加载资源读取的是这个编译后的目录下的文件。
  • 初始状态下已有Test.txt时可以正常读取,是因为你之前已经执行过项目构建,该文件已经被同步到类路径目录下,所以可以找到。
  • 你用FileWriter新建的文件是直接写入到src/test/resources源码目录的,代码运行过程中没有触发构建操作,新建的文件不会自动同步到类路径目录,因此getResource()找不到对应资源返回null,调用null.toURI()就会抛出空指针异常。
  • 补充:你前面通过拼接路径创建的input对象本身就已经持有文件的绝对路径,直接调用input.getPath()就能拿到路径,不需要绕弯从类路径读取。

额外优化建议

  • 路径拼接不要直接用字符串加反斜杠,Windows以外的系统无法识别,推荐用Paths.get(thisdir, "src", "test", "resources", "Test.txt").toString()实现跨平台路径拼接。
  • IO流用完需要手动关闭,或者用try-with-resources语法自动关闭,否则部分写入内容可能还在缓冲区没刷入磁盘,也会造成资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:45:06