Как читать большой текстовый файл построчно, используя Java? - PullRequest
785 голосов
/ 03 мая 2011

Мне нужно построчно читать большой текстовый файл размером около 5-6 ГБ, используя Java.

Как я могу сделать это быстро?

Ответы [ 21 ]

10 голосов
/ 07 июля 2015

В Java 8 также есть альтернатива использованию Files.lines().Если ваш входной источник не файл, а что-то более абстрактное, например Reader или InputStream, вы можете передавать строки с помощью метода BufferedReader s lines().

Например:

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

будет вызывать processLine() для каждой строки ввода, прочитанной BufferedReader.

9 голосов
/ 03 мая 2011

Вы можете использовать сканер класса

Scanner sc=new Scanner(file);
sc.nextLine();
7 голосов
/ 03 мая 2011

Вам необходимо использовать метод readLine() в class BufferedReader.Создайте новый объект из этого класса, примените этот метод к нему и сохраните его в строку.

BufferReader Javadoc

6 голосов
/ 20 мая 2014

Java-9:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
        stream.forEach(System.out::println);
}
5 голосов
/ 20 августа 2016

Четкий способ добиться этого,

Например:

Если у вас есть 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();
    }
}

Вывод, как показано ниже, enter image description here

3 голосов
/ 17 сентября 2017
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");
}

Это работает для меня. Надеюсь, это вам тоже поможет.

2 голосов
/ 22 мая 2015

Я обычно делаю рутину чтения просто:

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) {
        }
    }
}
1 голос
/ 22 сентября 2017

Вы можете использовать потоки, чтобы сделать это более точно:

Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);
0 голосов
/ 26 октября 2017

Вы можете использовать этот код:

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

    }

}
0 голосов
/ 19 января 2019

при использовании org.apache.commons.io пакет увеличил производительность, особенно в устаревшем коде, который использует Java 6 и ниже.
Java7 имеет лучший API с меньшим количеством обработок исключенийи другие полезные методы

LineIterator lineIterator =null;
    try{
    lineIterator = FileUtils.lineIterator(new File("/home/username/m.log"), "windows-1256");//second parameter is optionanl
    while (lineIterator.hasNext()){
      String currentLine = lineIterator.next();   
     //some operation
    } 
    }finally {  
     LineIterator.closeQuietly(lineIterator);
    }

maven

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
...