如何用Java读取文件

时间:2020-01-09 10:35:30  来源:igfitidea点击:

在Java中,有多种读取或者写入文件的方式,在本文中,我们将介绍一些在Java中读取文件的方式。

我们可以使用Java读取文件的一些选项是

  • 使用BufferedReader包裹在Reader周围。参见示例。
  • 使用Scanner类。参见示例。
  • 在java.nio.file.Files类中使用方法,例如readAllLines(),newBufferedReader和lines()方法。参见示例。

要查看Java可用的用于写文件的其他选项,请参阅这篇文章如何在Java中写文件

使用BufferedReader读取Java文件

使用Java BufferedReader类,我们可以从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。

如果不进行缓冲,则每次调用read()或者readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能会非常低效。因此,建议将BufferedReader包装在其read()操作可能会很昂贵的任何Reader周围,例如FileReaders和InputStreamReaders。

Java程序使用BufferedReader读取文件

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile {

	public static void main(String[] args) {
		BufferedReader br = null;
		try{
		   String strLine;
		   //FileReader instance wrapped in a BufferedReader
		   br = new BufferedReader(new FileReader("D:\test.txt"));
		   
		   while((strLine = br.readLine()) != null){
			   System.out.println(strLine);
		   }
		}catch(IOException exp){
			System.out.println("Error while reading file " + exp.getMessage());
		}finally {
			try {
				// Close the stream
				if(br != null){
					br.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

使用try-with-resources可以缩短我们需要编写的代码,因为在这种情况下,我们最终不需要阻塞来显式关闭流。流将自动关闭。

具有try-with-resources的BufferedReader

public class ReadFile {

  public static void main(String[] args) {
    try(BufferedReader br  = new BufferedReader(new FileReader("D:\test.txt"))){
      String strLine;
      while((strLine = br.readLine()) != null){
        System.out.println(strLine);
      }
    }catch(IOException exp){
      System.out.println("Error while reading file " + exp.getMessage());
    }
  }
}

使用扫描仪读取文件

我们还可以使用Scanner类读取Java中的文件。 Scanner类具有一个构造函数,我们可以在其中传递File作为参数。使用nextLine()方法,我们可以逐行读取文件,其中每一行均以String形式返回。

Java程序使用扫描仪读取文件

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadFile {
	public static void main(String[] args) {
		File file = new File("D:\test.txt");
		Scanner sc = null;
		try {
			sc = new Scanner(file);
			// Check if there is another line of input
			while(sc.hasNextLine()){
				String str = sc.nextLine();
			    System.out.println(str);
			}
		}catch (FileNotFoundException e) {
			System.out.println("Error while trying to read file " + e.getMessage());
		}finally{
			if(sc != null){
				sc.close();
			}
		}
	}		
}

使用Files.readAllLines方法读取文件

从Java 8开始,我们可以使用Files类的readAllLines()方法来读取Java中的文件。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class ReadFile {
	public static void main(String[] args) {
		Path path = Paths.get("D:\test.txt");
		try {
			List fileList = Files.readAllLines(path);
			System.out.println("" + fileList);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

如我们所见,readAllLines()方法可一次读取整个文件并将其存储到List中,这不是读取文件的非常有效的方法。 Files类提供了一种使用newBufferedReader方法读取文件的更好方法。

使用Files.newBufferedReader方法读取文件

newBufferedReader方法将打开一个文件进行读取,并返回BufferedReader以有效方式从文件中读取文本。
一旦有了BufferedReader实例,就可以使用lines()方法逐行读取文件。此方法返回一个Stream,其元素是从此BufferedReader中读取的行。流是延迟填充的,即只读在终端流操作期间发生。

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class ReadFile {
	public static void main(String[] args) {
		Path path = Paths.get("D:\test.txt");
		try(BufferedReader br = Files.newBufferedReader(path)){
			Stream stream = br.lines();
			stream.forEach(System.out::println);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

使用Files.lines方法读取文件

Files类还具有lines()方法,可用于读取Java中的文件。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class ReadFile {
	public static void main(String[] args) {
		Path path = Paths.get("D:\test.txt");
		// Using Lines method
		try(Stream stream = Files.lines(path)){
			stream.forEach(System.out::println);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}