Java读取文本文件

有很多种方法可以在Java中读取文本文件。让我们逐一看看Java读取文本文件的不同方法。

Java读取文本文件

在Java中读取文本文件的方法有很多。文本文件由字符组成,因此我们可以使用Reader类。还有一些实用类可用于在Java中读取文本文件。

  1. 使用Files类在Java中读取文本文件
  2. 使用FileReader在Java中读取文本文件
  3. 使用BufferedReader读取Java文本文件
  4. 使用Scanner类在Java中读取文本文件

现在让我们看一下使用这些类读取Java文本文件的示例。

Java 使用 java.nio.file.Files 读取文本文件

我们可以使用 Files 类将文件的所有内容读取到字节数组中。Files 类还有一个方法可以将所有行读取到字符串列表中。Files 类是在 Java 7 中引入的,如果您想要加载文件的所有内容,这是一个不错的选择。只有在处理小文件并且需要将文件的所有内容加载到内存中时,才应该使用这种方法。

String fileName = "/Users/pankaj/source.txt";
Path path = Paths.get(fileName);
byte[] bytes = Files.readAllBytes(path);
List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);

使用 java.io.FileReader 在 Java 中读取文本文件

您可以使用 FileReader 来获取 BufferedReader,然后逐行读取文件。FileReader 不支持编码,并且使用系统默认编码,因此这不是在 Java 中读取文本文件的一种非常高效的方式。

String fileName = "/Users/pankaj/source.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while((line = br.readLine()) != null){
    //处理每行
    System.out.println(line);
}

Java 使用 java.io.BufferedReader 读取文本文件

BufferedReader很适合逐行读取文件并对其进行处理。它非常适合处理大文件,还支持编码。BufferedReader是同步的,因此可以安全地从多个线程对其进行读取操作。BufferedReader的默认缓冲区大小为8KB。

String fileName = "/Users/pankaj/source.txt";
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, cs);
BufferedReader br = new BufferedReader(isr);

String line;
while((line = br.readLine()) != null){
     //处理每一行
     System.out.println(line);
}
br.close();

在Java中使用Scanner读取文本文件

如果您想要逐行读取文件或基于某些Java正则表达式,则应该使用Scanner类。Scanner使用分隔符模式将其输入分解为标记,默认情况下匹配空白字符。然后,可以使用各种next方法将生成的标记转换为不同类型的值。Scanner类不是同步的,因此不是线程安全的。

Path path = Paths.get(fileName);
Scanner scanner = new Scanner(path);
System.out.println("Read text file using Scanner");
//逐行读取
while(scanner.hasNextLine()){
    //处理每一行
    String line = scanner.nextLine();
    System.out.println(line);
}
scanner.close();

Java读取文件示例

以下是一个示例类,展示了如何在Java中读取文本文件。示例方法使用了Scanner、Files、支持编码的BufferedReader和FileReader。

package com.journaldev.files;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;

public class JavaReadFile {

    public static void main(String[] args) throws IOException {
        String fileName = "/Users/pankaj/source.txt";
        
        //使用Java 7的Files类处理小文件,获取完整的文件数据
        readUsingFiles(fileName);
        
        //使用Scanner类处理大文件,逐行读取
        readUsingScanner(fileName);
        
        //使用BufferedReader读取,逐行读取
        readUsingBufferedReader(fileName);
        readUsingBufferedReaderJava7(fileName, StandardCharsets.UTF_8);
        readUsingBufferedReader(fileName, StandardCharsets.UTF_8);
        
        //使用FileReader读取,不支持编码,效率低
        readUsingFileReader(fileName);
    }

    private static void readUsingFileReader(String fileName) throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        System.out.println("Reading text file using FileReader");
        while((line = br.readLine()) != null){
            //处理每一行
            System.out.println(line);
        }
        br.close();
        fr.close();
        
    }

    private static void readUsingBufferedReader(String fileName, Charset cs) throws IOException {
        File file = new File(fileName);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis, cs);
        BufferedReader br = new BufferedReader(isr);
        String line;
        System.out.println("Read text file using InputStreamReader");
        while((line = br.readLine()) != null){
            //处理每一行
            System.out.println(line);
        }
        br.close();
        
    }

    private static void readUsingBufferedReaderJava7(String fileName, Charset cs) throws IOException {
        Path path = Paths.get(fileName);
        BufferedReader br = Files.newBufferedReader(path, cs);
        String line;
        System.out.println("Read text file using BufferedReader Java 7 improvement");
        while((line = br.readLine()) != null){
            //处理每一行
            System.out.println(line);
        }
        br.close();
    }

    private static void readUsingBufferedReader(String fileName) throws IOException {
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        System.out.println("Read text file using BufferedReader");
        while((line = br.readLine()) != null){
            //处理每一行
            System.out.println(line);
        }
        //关闭资源
        br.close();
        fr.close();
    }

    private static void readUsingScanner(String fileName) throws IOException {
        Path path = Paths.get(fileName);
        Scanner scanner = new Scanner(path);
        System.out.println("Read text file using Scanner");
        //逐行读取
        while(scanner.hasNextLine()){
            //处理每一行
            String line = scanner.nextLine();
            System.out.println(line);
        }
        scanner.close();
    }

    private static void readUsingFiles(String fileName) throws IOException {
        Path path = Paths.get(fileName);
        //将文件读取到字节数组中
        byte[] bytes = Files.readAllBytes(path);
        System.out.println("Read text file using Files class");
        //将文件读取到字符串列表中
        @SuppressWarnings("unused")
		List allLines = Files.readAllLines(path, StandardCharsets.UTF_8);
        System.out.println(new String(bytes));
    }

}

使用Scanner、BufferedReader或Files来读取文件的选择取决于您的项目需求。例如,如果您只是记录文件,可以使用Files和BufferedReader。如果您想根据分隔符解析文件,应该使用Scanner类。在结束本教程之前,我想提一下RandomAccessFile。我们可以使用它来读取Java中的文本文件。

RandomAccessFile file = new RandomAccessFile("/Users/pankaj/Downloads/myfile.txt", "r");
String str;

while ((str = file.readLine()) != null) {
	System.out.println(str);
}
file.close();

以上就是Java读取文本文件示例程序的全部内容。

Source:
https://www.digitalocean.com/community/tutorials/java-read-text-file