核心概念
无论使用哪种方法,核心都是通过 输入流 和 输出流 来操作文件数据。

- 读取文件 (打开):使用
InputStream或其子类(如FileInputStream)将文件内容读入程序。 - 写入文件 (保存):使用
OutputStream或其子类(如FileOutputStream)将程序数据写入文件。
使用 java.nio.file (Java 7+) - 最推荐
这是目前 Java 中处理文件和目录的现代、标准方式,它比旧的 java.io API 更强大、更灵活,并且支持许多高级特性(如链接、属性等)。
使用 Files 工具类 (最简单)
Files 类提供了大量静态方法,可以轻松完成文件的读写操作。
示例:读取整个文件内容到字符串
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class ReadFileWithNIO {
public static void main(String[] args) {
// 文件路径
String filePath = "my-file.txt";
try {
// Files.readString() 是 Java 11 引入的非常方便的方法
// 它会一次性读取文件的全部内容到一个字符串中
String content = Files.readString(Paths.get(filePath), StandardCharsets.UTF_8);
System.out.println("文件内容如下:");
System.out.println(content);
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
示例:将字符串写入文件 (保存)
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class WriteFileWithNIO {
public static void main(String[] args) {
// 文件路径
String filePath = "output.txt";
// 要写入的内容
String content = "你好,世界!\n这是使用 Java NIO 写入的文件。";
try {
// Files.writeString() 是 Java 11 引入的便捷方法
// 它会自动创建文件(如果不存在)并写入内容
// StandardCharsets.UTF_8 指定了字符编码,非常重要!
Files.writeString(Paths.get(filePath), content, StandardCharsets.UTF_8);
System.out.println("文件已成功保存到: " + filePath);
} catch (IOException e) {
System.err.println("写入文件时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
java.nio.file 的优点:
- 代码简洁:
readString和writeString方法非常直观。 - 异常处理:所有 I/O 操作都受
IOException统一管理。 - 编码支持:可以方便地指定字符集,避免乱码。
- 功能强大:除了读写,还能轻松实现文件复制、移动、删除、获取属性等。
使用 java.io (传统方式)
这是在 Java 7 之前一直使用的传统 I/O API,虽然现在有更现代的替代方案,但在很多旧项目中仍然可以看到。

使用 FileReader / FileWriter (用于文本文件)
示例:读取文本文件
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class ReadFileWithIO {
public static void main(String[] args) {
String filePath = "my-file.txt";
// 使用 try-with-resources 语句,可以自动关闭资源
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
System.out.println("文件内容如下:");
// 逐行读取
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
示例:写入文本文件
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
public class WriteFileWithIO {
public static void main(String[] args) {
String filePath = "output.txt";
String content = "你好,世界!\n这是使用 Java IO 写入的文件。";
// 使用 try-with-resources 语句
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
// 写入内容
writer.write(content);
System.out.println("文件已成功保存到: " + filePath);
} catch (IOException e) {
System.err.println("写入文件时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
重要提示:
FileReader和FileWriter默认使用系统默认的字符编码,这可能会导致在不同系统上出现乱码问题。- 为了解决编码问题,强烈建议使用
InputStreamReader和OutputStreamWriter来包装FileInputStream和FileOutputStream,并明确指定字符集(如StandardCharsets.UTF_8)。
在图形用户界面 中打开/保存文件
如果你的程序有图形界面,用户通常期望通过标准的“打开文件”或“保存文件”对话框来选择文件路径,这时,你需要使用 GUI 库提供的组件。
使用 Swing (Java 的标准 GUI 库)
示例:打开文件对话框
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
public class SwingOpenFileExample {
public static void main(String[] args) {
// 在事件分发线程中创建和显示 GUI
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("文件打开示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLayout(new java.awt.FlowLayout());
JButton openButton = new JButton("打开文件");
JLabel label = new JLabel("请选择一个文件");
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 创建一个文件选择器
JFileChooser fileChooser = new JFileChooser();
// 设置对话框标题
fileChooser.setDialogTitle("请选择要打开的文件");
// 显示打开文件对话框,如果用户点击了“打开”
int userSelection = fileChooser.showOpenDialog(frame);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
label.setText("已选择文件: " + selectedFile.getAbsolutePath());
// 读取文件内容
try {
String content = Files.readString(selectedFile.toPath(), StandardCharsets.UTF_8);
// 这里可以显示在文本区域等组件中
System.out.println("文件内容:\n" + content);
} catch (IOException ex) {
JOptionPane.showMessageDialog(frame, "读取文件失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}
}
});
frame.add(openButton);
frame.add(label);
frame.setVisible(true);
});
}
}
示例:保存文件对话框
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.charset.StandardCharsets;
public class SwingSaveFileExample {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("文件保存示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLayout(new java.awt.FlowLayout());
JButton saveButton = new JButton("保存文件");
JLabel label = new JLabel("点击按钮保存文件");
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String content = "这是要保存的内容。";
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("保存文件");
// 显示保存文件对话框
int userSelection = fileChooser.showSaveDialog(frame);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
try {
// 写入文件
Files.writeString(fileToSave.toPath(), content, StandardCharsets.UTF_8);
label.setText("文件已成功保存到: " + fileToSave.getAbsolutePath());
} catch (IOException ex) {
JOptionPane.showMessageDialog(frame, "保存文件失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}
}
});
frame.add(saveButton);
frame.add(label);
frame.setVisible(true);
});
}
}
总结与建议
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 控制台应用 / 后台服务 | java.nio.file.Files |
代码简洁、功能强大、现代标准 | 无明显缺点 |
java.io |
兼容性好,在旧代码中常见 | API 繁琐,编码处理麻烦 | |
| 桌面应用 | Swing JFileChooser + java.nio.file.Files |
用户体验好,符合操作系统习惯 | 需要引入 Swing 库 |
JavaFX FileChooser + java.nio.file.Files |
更现代的 GUI 库,功能更丰富 | 需要引入 JavaFX 库 |
核心建议:
- 对于新的 Java 项目,优先使用
java.nio.file包,它是未来的方向,代码更优雅、更安全。 - 在 GUI 应用中,务必使用
JFileChooser(Swing) 或FileChooser(JavaFX) 来让用户选择文件,这是标准做法。 - 始终处理
IOException,文件操作是不可靠的,可能会因为文件不存在、无权限等原因失败。 - 明确指定字符编码,特别是处理文本文件时,强烈建议使用
StandardCharsets.UTF_8,避免乱码问题。 - 使用
try-with-resources语句,它可以自动关闭文件流,防止资源泄漏,是 Java 7+ 的最佳实践。

