杰瑞科技汇

Java Eclipse如何读取文件?

在 Eclipse 中创建项目并添加文件

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

Java Eclipse如何读取文件?-图1
(图片来源网络,侵删)
  1. 创建 Java 项目:

    • 打开 Eclipse。
    • 点击 File -> New -> Java Project
    • 输入项目名称,FileReaderDemo,然后点击 Finish
  2. 创建要读取的文件:

    • 在 Eclipse 的 Package Explorer 视图中,找到你的项目 FileReaderDemo
    • 右键点击项目根目录 -> New -> File
    • 输入文件名,myData.txt
    • 点击 Finish
    • 在打开的编辑器中,输入一些测试数据,
      Hello, Eclipse!
      This is a test file.
      第二行
      12345
    • 保存文件。
  3. 创建 Java 类:

    • 右键点击项目下的 src 文件夹 -> New -> Class
    • 输入类名,ReadFileExample
    • 勾选 public static void main(String[] args),然后点击 Finish

你的项目结构应该看起来像这样:

Java Eclipse如何读取文件?-图2
(图片来源网络,侵删)
FileReaderDemo/
├── src/
│   └── ReadFileExample.java
└── myData.txt

使用 FilesPaths (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,对于小文件非常方便。
  • 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 块执行完毕后,这个对象会自动被关闭,即使发生了异常。
    • 这可以防止资源泄漏,是必须遵守的最佳实践
  • reader.readLine():
    • 读取文件的下一行内容,并将其作为一个 String 返回。
    • 当到达文件末尾时,它会返回 nullwhile 循环会终止。

使用 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 稍差 需要从文件中解析出数字、单词等特定格式时

推荐选择:

  1. 如果使用 Java 7 或更高版本:

    Java Eclipse如何读取文件?-图3
    (图片来源网络,侵删)
    • 对于小文件,首选 Files.readAllLines()Files.readString() (Java 11+),因为它们最简单、最安全。
    • 对于大文件,必须使用 BufferedReader 逐行读取,以避免 OutOfMemoryError
  2. 如果使用 Java 6 或更早版本:

    • 必须使用 BufferedReader
  3. 关于字符编码:

    • 如果文件内容包含中文等非英文字符,为了避免乱码,强烈建议在创建 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 项目中读取文件!

分享:
扫描分享到社交APP
上一篇
下一篇