Как прочитать большой текстовый файл построчно с помощью Java?

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

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

Комментарии к вопросу (4)

Общий шаблон использовать

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

Вы можете считывать данные быстрее, если вы предполагаете, нет кодировки. например, в ASCII-7, но он выиграл'т сделать большой разницы. Весьма вероятно, что то, что вы делаете с данными, займет гораздо больше времени.

Редактировать: менее распространенный шаблон, чтобы использовать, чтобы избежать охвата линия утечка.

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 stream = Files.lines(Paths.get(fileName))) {
        stream.forEach(System.out::println);
}

Примечание: Вы должны поместить поток в попытки с ресурсами блок для обеспечения #метод close вызывается, в противном случае исходный файл, дескриптор не закрыт до ГК это гораздо позже.

Комментарии (33)

Посмотрите на этот блог:

Размер буфера может быть задан, или может быть использован размер по умолчанию. по умолчанию достаточно велик для большинства > целей. целей.

// 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
fstream.close();
Комментарии (4)

Один раз [тегов:на Java 8] вышел (март 2014) вы'll быть в состоянии использовать потоки:

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

Печать всех строк в файле:

try (Stream lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}
Комментарии (5)

Вот пример с обработкой полный ошибок и поддерживая спецификация кодировку до версии Java 7. С Java 7 Вы можете использовать try-с-ресурсами синтаксиса, который делает чище код.

Если вы просто хотите, чтобы кодировку можно пропустить InputStream и использовать FileReader.

InputStream ins = null; // raw byte-stream
Reader r = null; // cooked reader
BufferedReader br = null; // buffered for readLine()
try {
    String s;
    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-версии, с полной обработкой ошибок:

File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}
Комментарии (2)

В Java 8, вы могли бы сделать:

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

Некоторые заметки: поток возвращаемых файлов.линий (в отличие от большинства потоков) должен быть закрыт. По причинам, упомянутые здесь я не использую еогеасп(). В чужом коде (повторяемое в<строка> В) строки::итератор бросает поток повторяемое.

Комментарии (8)

Что вы можете сделать, это отсканировать весь текст через сканер, и пройти через текст построчно. Конечно, вы должны импортировать следующие:

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, если есть еще несколько строк в тексте. Этот .строки() функция дает вам всю строку как строку, затем вы можете использовать, как вы хотите. Попробовать Систему.из.код println(линия) для печати текста.

Примечание Стороны: .txt-это текстовый тип файла.

Комментарии (2)

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), поэтому вы должны указать кодировку.

Комментарии (1)

В 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);
}
Комментарии (5)

Я задокументирован и проверен 10 разных способов чтения файла в Java, а затем запустил их друг против друга, заставляя их читать в тестовые файлы от 1 Кб до 1 ГБ. Здесь представлены быстрый файл 3 методы чтения для чтения тестового файла 1ГБ.

Обратите внимание, что при запуске тестов производительности я не'т ничего в консоль так что бы реально замедлить теста. Я просто хотел проверить скорость сырое значение.

  1. Ява.НИО.файл.Файлов.readAllBytes()

Тестирование в Java 7, 8, 9. Это было в целом, самый быстрый способ. Чтение файла 1ГБ стабильно раз в 1 секунду.

import java.io..File;
import java.io.IOException;
import java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}
  1. Ява.НИО.файл.Файлов.линии()

Это было успешно протестировано в Java 8 и 9, но он выиграл't работа в Java 7 из-за отсутствия поддержки лямбда-выражений. Это заняло около 3.5 секунд, чтобы прочитать в файле 1 Гб, который поставит его на второе место как чтение больших файлов.

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

public class ReadFile_Files_Lines {
  public static void main(String[] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    try (Stream linesStream = Files.lines(file.toPath())) {
      linesStream.forEach(line -> {
        System.out.println(line);
      });
    }
  }
}
  1. командой bufferedreader

Протестирован для работы в Java 7, 8, 9. Это произошло около 4,5 секунд на чтение в тестовый файл 1ГБ.

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

public class ReadFile_BufferedReader_ReadLine {
  public static void main(String [] args) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    FileReader fileReader = new FileReader(fileName);

    try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
      String line;
      while((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
      }
    }
  }

Вы можете найти полный рейтинг по всем 10 способов чтения файла здесь.

Комментарии (3)

В Java 8, есть также альтернативы с помощью файлов .линии(). Если нет источника входного сигнала'т файл, но что-то более абстрактное, как читатель или потока, вы можете stream линий по линий по командой bufferedreader()` метод.

Например:

в

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

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

Комментарии (0)

Для чтение файла с 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 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();
        }
        }
    }
Комментарии (0)

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

Scanner sc=new Scanner(file);
sc.nextLine();
Комментарии (5)

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

BufferReader Javadoc

Комментарии (1)

Ява-9 :

try (Stream stream = Files.lines(Paths.get(fileName))) {
        stream.forEach(System.out::println);
}
Комментарии (7)

Ясный путь для достижения этого

Например:

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

Выход вроде как ниже,

Комментарии (2)
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");
}

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

Комментарии (0)

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

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) {
        }
    }
}
Комментарии (0)

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

Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);
Комментарии (3)

с помощью орг."Апач".общин.Ио пакет дал более высокую производительность, особенно в legacy код, который использует 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);
    }

Мэйвен



    commons-io
    commons-io
    2.6
Комментарии (0)

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

File file = new File("/home/user/file.txt");
try {
    List lines = FileUtils.readLines(file);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Комментарии (1)