根本原因是父目录未创建;File.createNewFile()前需用mkdirs()确保路径存在,且应显式指定UTF-8编码、用System.lineSeparator()处理换行、监听关闭事件并维护isModified状态。

用 File 创建文件却提示“系统找不到指定路径”
根本原因不是文件不存在,而是父目录没创建。Java 的 File 对象调用 createNewFile() 前,必须确保所在目录已存在,否则抛 IOException。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 别只调
file.createNewFile(),先用file.getParentFile().mkdirs()确保路径完整 -
mkdirs()比mkdir()更安全,能递归建多级目录 - 注意:Windows 路径分隔符用
\或正斜杠/都行,但不要混用(如"C: otes est.txt"会因转义失败) - 推荐用
Paths.get("notes", "demo.txt").toFile()构造,天然规避拼接问题
用 FileReader/FileWriter 读写中文乱码
字符流默认使用平台编码(Windows 是 GBK),而现代编辑器(如 VS Code、IDEA)默认保存为 UTF-8,不显式指定编码就会乱码。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 绝对不要用无参构造的
FileReader/FileWriter - 改用
InputStreamReader(new FileInputStream(file), "UTF-8")和OutputStreamWriter(new FileOutputStream(file), "UTF-8") - JDK 11+ 可直接用
Files.readString(path, StandardCharsets.UTF_8)和Files.writeString(path, content, StandardCharsets.UTF_8),更简洁且自动处理关闭 - 如果用户手动选编码保存(比如记事本里存为 ANSI),那程序也得按对应编码读——没有“万能解码”
文本内容换行在不同系统显示不一致
Windows 用
,Linux/macOS 用
。硬写 "
" 在 Windows 上打开可能显示为一行;反之亦然。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 写入时统一用
System.lineSeparator()替代手写" "或" " - 读取时不用特别处理换行符,
BufferedReader.readLine()自动剥离所有常见换行格式(、、) - 如果做逐行编辑(比如插入/删除某行),记得写回时仍用
System.lineSeparator(),别沿用原始换行符——否则跨平台保存后可能变双换行
程序退出时不保存导致内容丢失
GUI 记事本必须监听窗口关闭事件,在真正退出前把内存文本写入磁盘。直接杀进程或点 × 不触发任何 Java 逻辑,数据就没了。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Swing 下用
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE),再手动加windowClosing监听器 - 监听器里先弹确认框,用户点“保存”再调用写文件逻辑,成功后再
System.exit(0) - 写文件操作务必放在 try-catch 外层,避免异常导致跳过保存;失败时给出明确提示(比如
JOptionPane.showMessageDialog(null, "保存失败:" + e.getMessage())) - 别依赖
Runtime.addShutdownHook()——它不保证执行时机,GUI 程序中基本不可靠
最麻烦的其实是“用户改了内容但没点保存,又想关窗”的状态管理:得维护一个 boolean isModified 标记,每次文本变更设为 true,每次成功保存重置为 false。这个标记漏掉,就等于白做了前面所有持久化逻辑。










