如何用Java读取文件
在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();
}
}
}

