Java 读取文件的 5 种方式

 2022-09-28

有多种写入和读取文本文件的方法。这在处理许多应用程序时是必需的。在 Java 中有多种方法可以读取纯文本文件,例如你可以使用FileReader、BufferedReader或Scanner来读取文本文件。每个实用程序都提供了一些特殊的东西,例如 BufferedReader 为快速读取提供数据缓冲,而 Scanner 提供解析能力。

方法:

  1. 使用 BufferedReader 类
  2. 使用 Scanner 类
  3. 使用文件阅读器类
  4. 读取列表中的整个文件
  5. 将文本文件读取为字符串

我们还可以同时使用 BufferReader 和 Scanner 在 Java 中逐行读取文本文件。然后 Java SE 8 引入了另一个 Stream 类 java.util.stream.Stream ,它提供了一种惰性且更有效的方式来读取文件。

让我们更深入地讨论上述每个方法,最重要的是通过一个干净的 Java 程序实现它们。

方法一: 使用BufferedReader类

此方法从字符输入流中读取文本。它确实缓冲以有效读取字符、数组和行。可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。通常,Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在任何 read() 操作可能代价高昂的 Reader 周围,例如 FileReaders 和 InputStreamReaders,如下所示:

    BufferedReader in = new BufferedReader(Reader in, int size);

例子:

    import java.io.*;
    public class HY {
    
    	public static void main(String[] args) throws Exception
    	{
    
    		File file = new File(
    			"C:\\Users\\pankaj\\Desktop\\test.txt");
    
    		BufferedReader br
    			= new BufferedReader(new FileReader(file));
    
    		String st;
    		while ((st = br.readLine()) != null)
    
    			System.out.println(st);
    	}
    }

方法二: 使用 FileReader 类

读取字符文件的便利类。此类的构造函数假定默认字符编码和默认字节缓冲区大小是合适的。

该类中定义的构造函数如下:

  1. FileReader(File file): 给定要读取的文件,创建一个新的 FileReader
  2. FileReader(FileDescriptor fd): 创建一个新的 FileReader,给定要从中读取的 FileDescriptor
  3. FileReader(String fileName): 创建一个新的 FileReader,给出要读取的文件名

例子:

    import java.io.*;
    public class GFG {
    	public static void main(String[] args) throws Exception
    	{
    
    		FileReader fr = new FileReader(
    			"C:\\Users\\pankaj\\Desktop\\test.txt");
    
    		int i;
    		while ((i = fr.read()) != -1)
    
    			System.out.print((char)i);
    	}
    }
    复制代码

方法 3: 使用 Scanner 类

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。Scanner 使用分隔符模式将其输入分解为标记,默认情况下与空格匹配。然后可以使用各种 next 方法将结果令牌转换为不同类型的值。

示例 1: 使用循环

    import java.io.File;
    import java.util.Scanner;
    public class ReadFromFileUsingScanner
    {
        public static void main(String[] args) throws Exception{
                File file = new File("C:\\Users\\pankaj\\Desktop\\test.txt");
                Scanner sc = new Scanner(file);
    
                while (sc.hasNextLine())
                System.out.println(sc.nextLine());
        }
    }

示例 2: 不使用循环

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    
    public class ReadingEntireFileWithoutLoop{
        public static void main(String[] args) throws FileNotFoundException{
                File file = new File("C:\\Users\\pankaj\\Desktop\\test.txt");
                Scanner sc = new Scanner(file);
                sc.useDelimiter("\\Z");
                System.out.println(sc.next());
        }
    }

方法 4: 读取列表中的整个文件

从文件中读取所有行。此方法可确保在读取所有字节或抛出 I/O 错误或其他运行时异常时关闭文件。使用指定的字符集将文件中的字节解码为字符。

语法:

    public static List readAllLines(Path path,Charset cs)throws IOException

此方法将以下内容识别为行终止符:

    \u000D 后跟 \u000A,回车后跟换行符
    \u000A,换行
    \u000D,回车

例子

    import java.util.*;
    import java.nio.charset.StandardCharsets;
    import java.nio.file.*;
    import java.io.*;
    public class ReadFileIntoList{
        public static List<String> readFileInList(String fileName){
            List<String> lines = Collections.emptyList();
            try{
                lines =
                Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8);
            }
    
            catch (IOException e){
                e.printStackTrace();
                }
            return lines;
        }
        
        public static void main(String[] args){
            List l = readFileInList("C:\\Users\\pankaj\\Desktop\\test.java");
            Iterator<String> itr = l.iterator();
            while (itr.hasNext())
            System.out.println(itr.next());
        }
    }

方法 5: 将文本文件读取为字符串

例子

    package io;
    import java.nio.file.*;;
    public class ReadTextAsString {
        public static String readFileAsString(String fileName)throws Exception{
                String data = "";
                data = new String(Files.readAllBytes(Paths.get(fileName)));
                return data;
        }
    
        public static void main(String[] args) throws Exception{
                String data = readFileAsString("C:\\Users\\pankaj\\Desktop\\test.java");
                System.out.println(data);
        }
    }