如何使用Java逐行读取大型文本文件?

我需要使用Java逐行读取大约5-6 GB的大文本文件。

我怎样才能快速做到这一点?

一个常见的模式是使用

try (BufferedReader br = new BufferedReader(new FileReader(file))) { String line; while ((line = br.readLine()) != null) { // process the line. } } 

如果您认为没有字符编码,您可以更快地读取数据。 例如ASCII-7,但不会有太大的区别。 数据处理很可能需要更长的时间。

编辑:不常见的模式,以避免line泄漏的范围。

 try(BufferedReader br = new BufferedReader(new FileReader(file))) { for(String line; (line = br.readLine()) != null; ) { // process the line. } // line is not visible here. } 

更新:在Java 8中,你可以做

 try (Stream<String> stream = Files.lines(Paths.get(fileName))) { stream.forEach(System.out::println); } 

注意:您必须将Stream放在try-with-resource块中,以确保对其调用#close方法,否则基本的文件句柄将永远不会closures,直到GC晚了很久。

看这个博客:

  • Java逐行阅读文件 – Java教程

缓冲区大小可以被指定,或者可以使用默认大小。 默认值对于大多数目的而言足够大。

 // Open the file FileInputStream fstream = new FileInputStream("textfile.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); String strLine; //Read File Line By Line while ((strLine = br.readLine()) != null) { // Print the content on the console System.out.println (strLine); } //Close the input stream br.close(); 

一旦java-8发布(2014年3月),您将可以使用stream:

 try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) { lines.forEachOrdered(line -> process(line)); } 

打印文件中的所有行:

 try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) { lines.forEachOrdered(System.out::println); } 

下面是一个完整的error handling和支持Java之前的字符集规范的示例。使用Java 7,您可以使用try-with-resources语法,这使得代码更加清晰。

如果你只是想要默认的字符集,你可以跳过InputStream并使用FileReader。

 InputStream ins = null; // raw byte-stream Reader r = null; // cooked reader BufferedReader br = null; // buffered for readLine() try { String s; if (true) { String data = "#foobar\t1234\n#xyz\t5678\none\ttwo\n"; ins = new ByteArrayInputStream(data.getBytes()); } else { ins = new FileInputStream("textfile.txt"); } r = new InputStreamReader(ins, "UTF-8"); // leave charset out for default br = new BufferedReader(r); while ((s = br.readLine()) != null) { System.out.println(s); } } catch (Exception e) { System.err.println(e.getMessage()); // handle exception } finally { if (br != null) { try { br.close(); } catch(Throwable t) { /* ensure close happens */ } } if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } } if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } } } 

这里是Groovy版本,完整的error handling:

 File f = new File("textfile.txt"); f.withReader("UTF-8") { br -> br.eachLine { line -> println line; } } 

在Java 8中,你可以这样做:

 try (Stream<String> lines = Files.lines (file, StandardCharsets.UTF_8)) { for (String line : (Iterable<String>) lines::iterator) { ; } } 

一些注意事项:由Files.lines返回的stream(不像大多数stream)需要closures。 由于这里提到的原因,我避免使用forEach() 。 奇怪的代码(Iterable<String>) lines::iterator将Stream转换为Iterable。

您可以使用扫描仪扫描整个文本,并逐行浏览文本。 当然你应该input以下内容:

 import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public static void readText throws FileNotFoundException { Scanner scan = new Scanner(new File("samplefilename.txt")); while(scan.hasNextLine()){ String line = scan.nextLine(); //Here you can manipulate the string the way you want } } 

扫描仪基本扫描所有的文字。 while循环用于遍历整个文本。

.hasNextLine()函数是一个布尔值,如果文本中还有更多行,则返回true。 .nextLine()函数为您提供了一个完整的行,您可以使用你想要的方式。 尝试System.out.println(line)打印文本。

注意:.txt是文件types文本。

FileReader不会让你指定编码,而是使用InputStreamReader来代替,如果你需要指定它:

 try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252")); String line; while ((line = br.readLine()) != null) { // process the line. } br.close(); } catch (IOException e) { e.printStackTrace(); } 

如果您从Windows导入此文件,则可能使用ANSI编码(Cp1252),因此您必须指定编码。

在Java 7中:

 String folderPath = "C:/folderOfMyFile"; Path path = Paths.get(folderPath, "myFileName.csv"); //or any text file eg.: txt, bat, etc Charset charset = Charset.forName("UTF-8"); try (BufferedReader reader = Files.newBufferedReader(path , charset)) { while ((line = reader.readLine()) != null ) { //separate all csv fields into string array String[] lineVariables = line.split(","); } } catch (IOException e) { System.err.println(e); } 

您可以使用扫描仪类

 Scanner sc=new Scanner(file); sc.nextLine(); 

用java 读文件 8

  package com.java.java8; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; /** * The Class ReadLargeFile. * * @author Ankit Sood Apr 20, 2017 */ public class ReadLargeFile { /** * The main method. * * @param args * the arguments */ public static void main(String[] args) { try { Stream<String> stream = Files.lines(Paths.get("C:\\Users\\System\\Desktop\\demoData.txt")); stream.forEach(System.out::println); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

您需要使用class BufferedReaderreadLine()方法。 从这个类创build一个新的对象,并在他身上运行这个方法,并保存到一个string。

BufferReader Javadoc

在Java 8中,也可以使用Files.lines() 。 如果你的input源不是一个文件,而是一个像ReaderInputStream这样更抽象的东西,你可以通过BufferedReaderlines()方法对这些行进行stream式处理。

例如:

 try( BufferedReader reader = new BufferedReader( ... ) ) { reader.lines().foreach( line -> processLine( line ) ); } 

将为由BufferedReader读取的每个input行调用processLine()

Java-9:

 try (Stream<String> stream = Files.lines(Paths.get(fileName))) { stream.forEach(System.out::println); } 

明确的方法来实现这一点,

例如:

如果您在当前目录中有dataFile.txt

 import java.io.*; import java.util.Scanner; import java.io.FileNotFoundException; public class readByLine { public readByLine() throws FileNotFoundException { Scanner linReader = new Scanner(new File("dataFile.txt")); while (linReader.hasNext()) { String line = linReader.nextLine(); System.out.println(line); } linReader.close(); } public static void main(String args[]) throws FileNotFoundException { new readByLine(); } } 

输出如下, 在这里输入图像描述

我通常会直接阅读例程:

 void readResource(InputStream source) throws IOException { BufferedReader stream = null; try { stream = new BufferedReader(new InputStreamReader(source)); while (true) { String line = stream.readLine(); if(line == null) { break; } //process line System.out.println(line) } } finally { closeQuiet(stream); } } static void closeQuiet(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (IOException ignore) { } } } 
 BufferedReader br; FileInputStream fin; try { fin = new FileInputStream(fileName); br = new BufferedReader(new InputStreamReader(fin)); /*Path pathToFile = Paths.get(fileName); br = Files.newBufferedReader(pathToFile,StandardCharsets.US_ASCII);*/ String line = br.readLine(); while (line != null) { String[] attributes = line.split(","); Movie movie = createMovie(attributes); movies.add(movie); line = br.readLine(); } fin.close(); br.close(); } catch (FileNotFoundException e) { System.out.println("Your Message"); } catch (IOException e) { System.out.println("Your Message"); } 

它适用于我。 希望它也会帮助你。

你也可以使用apache commons io

 File file = new File("/home/user/file.txt"); try { List<String> lines = FileUtils.readLines(file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

你可以使用这个代码:

 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class ReadTextFile { public static void main(String[] args) throws IOException { try { File f = new File("src/com/data.txt"); BufferedReader b = new BufferedReader(new FileReader(f)); String readLine = ""; System.out.println("Reading file using Buffered Reader"); while ((readLine = b.readLine()) != null) { System.out.println(readLine); } } catch (IOException e) { e.printStackTrace(); } } } 

您可以使用stream更精确地做到这一点:

 Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);