总结通过文件获取内容方式 在java中有很多读取文本文件的方法。文本文件由字符组成,因此可以使用Reader
类。在java中读取文本文件也有一些实用程序类。
使用Files
类读取文本文件;
使用FileReader
类读取文本文件;
使用BufferedReader
类读取文本文件;
使用Scanner
类读取文本文件;
方法一 使用java.nio.file.Files读取文本文件 使用Files
类将文件的所有内容读入字节数组。Files
类还有一个方法可以读取所有行到字符串列表。Files
类是在Java 7中引入的,如果想加载所有文件内容,使用这个类是比较适合的。只有在处理小文件并且需要加载所有文件内容到内存中时才应使用此方法。
1 2 3 4 5 String fileName = "D:/maxsu/docs/source.txt"; Path path = Paths.get(fileName); byte[] bytes = Files.readAllBytes(path); List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);
方法二:使用java.io.FileReader类 可以使用FileReader
获取BufferedReader
,然后逐行读取文件。FileReader不支持编码并使用系统默认编码,因此它不是一种java中读取文本文件的非常有效的方法。
1 2 3 4 5 6 7 8 9 10 11 12 String fileName = "D:/maxsu/docs/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.io.BufferedReader 如果想逐行读取文件并对它们进行处理,那么BufferedReader
是非常合适的。它适用于处理大文件,也支持编码。
BufferedReader
是同步的,因此可以安全地从多个线程完成对BufferedReader
的读取操作。BufferedReader
的默认缓冲区大小为:8KB
。
1 2 3 4 5 6 7 8 9 10 11 12 13 String fileName = "D:/maxsu/docs/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();
方法四:使用Scanner读取文本文件 如果要逐行读取文件或基于某些java正则表达式读取文件,则可使用Scanner
类。
Scanner
类使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。然后可以使用各种下一种方法将得到的标记转换成不同类型的值。Scanner
类不同步,因此不是线程安全的。
1 2 3 4 5 6 7 8 9 10 11 Path path = Paths.get(fileName); Scanner scanner = new Scanner(path); System.out.println("Read text file using Scanner"); // 一行一行地读取 while(scanner.hasNextLine()){ //process each line String line = scanner.nextLine(); System.out.println(line); } scanner.close();
方法五: 使用RandomAccessFile 读取文件 1 2 3 4 5 6 7 RandomAccessFile file = new RandomAccessFile("D:/maxsu/docs/readme.txt", "r"); String str; while ((str = file.readLine()) != null) { System.out.println(str); } file.close();
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 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 = "D:/maxsu/docs/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); } //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"); //逐行读取 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"); //read file to String list @SuppressWarnings("unused") List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8); System.out.println(new String(bytes)); } }