在 Eclipse 中创建项目并添加文件
在写代码之前,我们先在 Eclipse 中准备好一个测试项目和一个文件,这样可以直接运行和测试。

-
创建 Java 项目:
- 打开 Eclipse。
- 点击
File->New->Java Project。 - 输入项目名称,
FileReaderDemo,然后点击Finish。
-
创建要读取的文件:
- 在 Eclipse 的
Package Explorer视图中,找到你的项目FileReaderDemo。 - 右键点击项目根目录 ->
New->File。 - 输入文件名,
myData.txt。 - 点击
Finish。 - 在打开的编辑器中,输入一些测试数据,
Hello, Eclipse! This is a test file. 第二行 12345 - 保存文件。
- 在 Eclipse 的
-
创建 Java 类:
- 右键点击项目下的
src文件夹 ->New->Class。 - 输入类名,
ReadFileExample。 - 勾选
public static void main(String[] args),然后点击Finish。
- 右键点击项目下的
你的项目结构应该看起来像这样:

FileReaderDemo/
├── src/
│ └── ReadFileExample.java
└── myData.txt
使用 Files 和 Paths (Java 7+ 推荐,最现代、最简单)
这是自 Java 7 引入的 NIO (New I/O) API 的一部分,是目前最推荐的方式,它代码简洁,功能强大,并且能更好地处理字符编码。
核心代码
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class ReadFileExample {
public static void main(String[] args) {
// 1. 定义文件的路径
// 使用 "src/myData.txt" 是因为我们在 src 目录下运行程序
// 如果文件在项目根目录,可以直接使用 "myData.txt"
Path path = Paths.get("src/myData.txt");
try {
// 2. 读取所有行到 List<String> 中
// 这是读取文本文件最简单的方法
List<String> allLines = Files.readAllLines(path);
// 3. 遍历并打印每一行
System.out.println("--- 使用 Files.readAllLines 读取 ---");
for (String line : allLines) {
System.out.println(line);
}
System.out.println("\n--- 使用 Files.readString 读取 (Java 11+) ---");
// 如果你的 Java 版本是 11 或更高,可以使用更简单的方法
String content = Files.readString(path);
System.out.println(content);
} catch (IOException e) {
// 4. 处理可能发生的 IO 异常
// 文件不存在、没有读取权限等
System.err.println("读取文件时发生错误: " + e.getMessage());
e.printStackTrace();
}
}
}
代码解释
import java.nio.file.*;: 导入 NIO 相关的类。Path path = Paths.get("src/myData.txt");:Paths.get()是一个静态工厂方法,用于将字符串路径转换为Path对象。- 注意路径: 路径是相对于项目根目录的,如果你的文件在
src下,路径就是src/myData.txt,如果直接放在项目根目录下,myData.txt。
Files.readAllLines(path):- 这是一个非常方便的方法,它会一次性将文件的所有行读入一个
List<String>中,适用于小文件。 - 它会使用 JVM 默认的字符编码,这可能导致在某些系统上出现乱码,为了更安全,可以指定编码:
StandardCharsets.UTF_8。
- 这是一个非常方便的方法,它会一次性将文件的所有行读入一个
Files.readString(path):- Java 11 引入的方法,将整个文件内容读入一个
String,对于小文件非常方便。
- Java 11 引入的方法,将整个文件内容读入一个
try-catch (IOException e): 文件操作是 I/O 操作,可能会失败(如文件不存在、磁盘错误等),所以必须放在try-catch块中捕获IOException。
使用 BufferedReader (经典、高效)
这是在 Java 7 之前读取文本文件最标准、最高效的方法,因为它通过缓冲减少了磁盘 I/O 的次数,即使在今天,它仍然非常常用,尤其是在需要逐行处理大文件时。
核心代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFileExample_BufferedReader {
public static void main(String[] args) {
String filePath = "src/myData.txt";
// 使用 try-with-resources 语句 (Java 7+)
// 它会自动关闭实现了 AutoCloseable 接口的资源(如 Reader)
// 无需手动调用 close(),非常安全和推荐
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String currentLine;
System.out.println("--- 使用 BufferedReader 逐行读取 ---");
// readLine() 读取一行内容,但不包括换行符
// 当到达文件末尾时,readLine() 返回 null
while ((currentLine = reader.readLine()) != null) {
System.out.println(currentLine);
}
} catch (IOException e) {
System.err.println("读取文件时发生错误: " + e.getMessage());
e.printStackTrace();
}
}
}
代码解释
import java.io.*;: 导入传统的 I/O 相关类。new BufferedReader(new FileReader(filePath)):FileReader: 用于读取字符文件的便捷类,它使用默认的字符编码,这可能会导致乱码问题。BufferedReader: 为FileReader包装一个缓冲区,读取数据时,它会从文件中批量读取到内存中,然后逐行提供,大大提高了读取效率。
try-with-resources:- 这是 Java 7 的一个重要特性,只要将实现了
AutoCloseable接口的对象(如BufferedReader)放在try后面的括号里,try块执行完毕后,这个对象会自动被关闭,即使发生了异常。 - 这可以防止资源泄漏,是必须遵守的最佳实践。
- 这是 Java 7 的一个重要特性,只要将实现了
reader.readLine():- 读取文件的下一行内容,并将其作为一个
String返回。 - 当到达文件末尾时,它会返回
null,while循环会终止。
- 读取文件的下一行内容,并将其作为一个
使用 Scanner (简单、灵活)
Scanner 类通常用于解析基本类型和字符串,但它也可以非常方便地读取文件内容。
核心代码
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadFileExample_Scanner {
public static void main(String[] args) {
String filePath = "src/myData.txt";
File file = new File(filePath);
try (Scanner scanner = new Scanner(file)) {
System.out.println("--- 使用 Scanner 读取 ---");
// 使用 hasNextLine() 和 nextLine() 逐行读取
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.err.println("错误:文件未找到 - " + e.getMessage());
e.printStackTrace();
}
}
}
代码解释
new Scanner(file): 创建一个Scanner对象来读取File。scanner.hasNextLine(): 检查是否还有下一行可读。scanner.nextLine(): 读取并返回下一行的内容。try-with-resources:Scanner也实现了AutoCloseable,所以同样可以使用try-with-resources来确保关闭。
总结与如何选择
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
Files.readAllLines() |
代码最简洁,现代标准 | 一次性加载全部内容到内存,不适合超大文件 | Java 7+,小文件的快速读取 |
Files.readString() |
代码极简,一行搞定 | 一次性加载全部内容到内存,不适合超大文件 | Java 11+,非常小的文件 |
BufferedReader |
效率高,逐行处理,节省内存 | 代码稍多,需要处理编码问题 | 大文件的逐行处理,Java 7 之前的代码库 |
Scanner |
使用简单,灵活性高(可分词) | 性能比 BufferedReader 稍差 |
需要从文件中解析出数字、单词等特定格式时 |
推荐选择:
-
如果使用 Java 7 或更高版本:
(图片来源网络,侵删)- 对于小文件,首选
Files.readAllLines()或Files.readString()(Java 11+),因为它们最简单、最安全。 - 对于大文件,必须使用
BufferedReader逐行读取,以避免OutOfMemoryError。
- 对于小文件,首选
-
如果使用 Java 6 或更早版本:
- 必须使用
BufferedReader。
- 必须使用
-
关于字符编码:
- 如果文件内容包含中文等非英文字符,为了避免乱码,强烈建议在创建
FileReader时指定编码。 - 不推荐:
// 可能会乱码 new FileReader("myData.txt"); - 推荐做法 (使用
InputStreamReader):// 使用 try-with-resources try (BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream("src/myData.txt"), "UTF-8"))) { // ... 读取逻辑 } - 而
Files类的方法可以轻松解决这个问题:// 安全指定编码 List<String> lines = Files.readAllLines(Paths.get("src/myData.txt"), StandardCharsets.UTF_8);
- 如果文件内容包含中文等非英文字符,为了避免乱码,强烈建议在创建
希望这份详细的指南能帮助你顺利地在 Java Eclipse 项目中读取文件!
