为什么 Java 文件操作并不可怕?
\n\n每位开发者,即使只编写 Java 后端,迟早都会遇到需要保存数据、读取配置或处理日志的情况。Java 中的文件与文件系统操作是一项基本技能,它能将“玩具级”的控制台应用转变为真正的实用工具。是的,在 2024 年,我们不仅有老牌的 File,还有强大的 java.nio.file。
本文将涵盖所有内容:从打开记事本到操作权限。开始吧!
\n\n1. 经典方法:java.io.File
\n\n我们从“老前辈”开始。File 类出现在 Java 1.0 中,至今仍在使用。但说实话:它更侧重于元数据而非内容。可以用它来检查文件是否存在、创建文件夹、获取文件列表。
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。
2. 文件读取:从 InputStream 到 BufferedReader
\n\n读取是最常见的操作。如果是文本文件,请使用 BufferedReader——它会缓冲数据,运行速度快。
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:
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——这能确保流被关闭,即使抛出异常。
3. 文件写入:BufferedWriter 和 FileOutputStream
\n\n写入操作几乎与读取对称。对于文本,使用 BufferedWriter;对于二进制数据,使用 FileOutputStream。
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如果需要追加到文件末尾而不是覆盖它