如何用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(); } } }