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();