Java 文件操作:20分钟从新手到专家

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么 Java 文件操作并不可怕?

\n\n

每位开发者,即使只编写 Java 后端,迟早都会遇到需要保存数据、读取配置或处理日志的情况。Java 中的文件与文件系统操作是一项基本技能,它能将“玩具级”的控制台应用转变为真正的实用工具。是的,在 2024 年,我们不仅有老牌的 File,还有强大的 java.nio.file。

\n\n

本文将涵盖所有内容:从打开记事本到操作权限。开始吧!

\n\n

1. 经典方法:java.io.File

\n\n

我们从“老前辈”开始。File 类出现在 Java 1.0 中,至今仍在使用。但说实话:它更侧重于元数据而非内容。可以用它来检查文件是否存在、创建文件夹、获取文件列表。

\n\n
import java.io.File;\n\npublic class FileExample {\n    public static void main(String[] args) {\n        File file = new File("/home/user/docs/notes.txt");\n        \n        System.out.println("文件存在:" + file.exists());\n        System.out.println("绝对路径:" + file.getAbsolutePath());\n        System.out.println("大小:" + file.length() + " 字节");\n        \n        // 创建目录\n        File dir = new File("/home/user/new_folder");\n        if (dir.mkdir()) {\n            System.out.println("文件夹已创建");\n        }\n    }\n}
\n\n

缺点: File 无法很好地读取大文件——这需要流。而且它默认不支持符号链接(软链接)。正因如此,Sun(以及后来的 Oracle)推出了 NIO。

\n\n

2. 文件读取:从 InputStream 到 BufferedReader

\n\n

读取是最常见的操作。如果是文本文件,请使用 BufferedReader——它会缓冲数据,运行速度快。

\n\n
import java.io.BufferedReader;\nimport java.io.FileReader;\nimport java.io.IOException;\n\npublic class ReadFile {\n    public static void main(String[] args) {\n        try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {\n            String line;\n            while ((line = br.readLine()) != null) {\n                System.out.println(line);\n            }\n        } catch (IOException e) {\n            System.err.println("读取错误:" + e.getMessage());\n        }\n    }\n}
\n\n

对于二进制文件(图片、压缩包),请使用 FileInputStream:

\n\n
import java.io.FileInputStream;\nimport java.io.IOException;\n\npublic class ReadBinary {\n    public static void main(String[] args) {\n        try (FileInputStream fis = new FileInputStream("image.png")) {\n            byte[] buffer = new byte[1024];\n            int bytesRead;\n            while ((bytesRead = fis.read(buffer)) != -1) {\n                // 处理 buffer[0..bytesRead] 部分\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}
\n\n

重要提示:始终使用 try-with-resources——这能确保流被关闭,即使抛出异常。

\n\n

3. 文件写入:BufferedWriter 和 FileOutputStream

\n\n

写入操作几乎与读取对称。对于文本,使用 BufferedWriter;对于二进制数据,使用 FileOutputStream。

\n\n
import java.io.BufferedWriter;\nimport java.io.FileWriter;\nimport java.io.IOException;\n\npublic class WriteFile {\n    public static void main(String[] args) {\n        try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {\n            bw.write("你好,世界!");\n            bw.newLine();\n            bw.write("Java 很强大。");\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}
\n\n

如果需要追加到文件末尾而不是覆盖它

博客

书籍推荐