Java读取文本文件

时间:2020-02-23 14:36:47  来源:igfitidea点击:

有很多方法可以读取Java中的文本文件。
让我们逐一研究一下Java读取文本文件的不同方法。

Java读取文本文件

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

  • Java使用Files类读取文本文件
  • 使用FileReader在Java中读取文本文件
  • Java使用BufferedReader读取文本文件
  • 使用Scanner类读取Java中的文本文件

现在,让我们看一些示例,这些示例说明如何使用这些类在Java中读取文本文件。

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

我们可以使用Files类将文件的所有内容读入字节数组。
Files类还具有一种读取所有行到字符串列表的方法。
Files类是Java 7中引入的,如果您要加载所有文件内容,则很好。
仅在处理小型文件并且需要所有文件内容在内存中时,才应使用此方法。

String fileName = "/Users/hyman/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/hyman/source.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while((line = br.readLine()) != null){
  //process the line
  System.out.println(line);
}

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

如果要逐行读取文件并对其进行处理,则BufferedReader很好。
这对于处理大文件非常有用,并且还支持编码。

BufferedReader是同步的,因此可以安全地从多个线程完成对BufferedReader的读取操作。
BufferedReader的默认缓冲区大小为8KB。

String fileName = "/Users/hyman/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){
   //process the line
   System.out.println(line);
}
br.close();

使用扫描仪读取Java中的文本文件

如果要逐行或者基于某些Java正则表达式读取文件,则Scanner是要使用的类。

扫描程序使用定界符模式将其输入分为令牌,默认情况下,该模式与空格匹配。
然后,可以使用各种下一种方法将生成的令牌转换为不同类型的值。
扫描器类未同步,因此不是线程安全的。

Path path = Paths.get(fileName);
Scanner scanner = new Scanner(path);
System.out.println("Read text file using Scanner");
//read line by line
while(scanner.hasNextLine()){
  //process each line
  String line = scanner.nextLine();
  System.out.println(line);
}
scanner.close();

Java读取文件示例

这是显示如何在Java中读取文本文件的示例类。
示例方法使用的是Scanner,Files,具有编码支持的BufferedReader和FileReader。

package com.theitroad.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/hyman/source.txt";
      
      //using Java 7 Files class to process small files, get complete file data
      readUsingFiles(fileName);
      
      //using Scanner class for large files, to read line by line
      readUsingScanner(fileName);
      
      //read using BufferedReader, to read line by line
      readUsingBufferedReader(fileName);
      readUsingBufferedReaderJava7(fileName, StandardCharsets.UTF_8);
      readUsingBufferedReader(fileName, StandardCharsets.UTF_8);
      
      //read using FileReader, no encoding support, not efficient
      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){
          //process the line
          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){
          //process the line
          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){
          //process the line
          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){
          //process the line
          System.out.println(line);
      }
      //close resources
      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");
      //read line by line
      while(scanner.hasNextLine()){
          //process each line
          String line = scanner.nextLine();
          System.out.println(line);
      }
      scanner.close();
  }

  private static void readUsingFiles(String fileName) throws IOException {
      Path path = Paths.get(fileName);
      //read file to byte array
      byte[] bytes = Files.readAllBytes(path);
      System.out.println("Read text file using Files class");
      //read file to String list
      @SuppressWarnings("unused")
		List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);
      System.out.println(new String(bytes));
  }

}

使用Scanner或者BufferedReader或者Files读取文件的选择取决于您的项目要求。
例如,如果仅记录文件,则可以使用"文件"和" BufferedReader"。
如果要基于定界符解析文件,则应使用Scanner类。

在结束本教程之前,我想谈一谈" RandomAccessFile"。
我们可以使用它来读取Java中的文本文件。

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

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