Java读取文本文件
有很多方法可以读取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();

