Как читать файл построчно с помощью Java Stream - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь прочитать длинный файл построчно и одновременно пытаюсь извлечь некоторую информацию из строки.

Вот пример того, что я делаю:

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<String> linesStream = Files.lines(file.toPath())) {
            linesStream.forEach(line -> {
                System.out.println(line);
            });
        }
    }
}

Одна строка в моем файле разделена на три части:

10 1010101 15

Я хочу прочитать эти три информации каждый раз. Нравится:

String str1 = line[0];
String str2 = line[1];
String str3 = line[2];

Решение, которое я ищу, будет лучше, если я не преобразую поток в коллекцию. Я буду использовать эти 3 строки для создания структуры данных графа, что-то вроде:

createGraphe(str1,str2,str3);`

Я знаю, что могу отправить полную строку, но когда я изучаю Stream, мне интересно узнать, как извлечь эту информацию.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы можете сопоставить массив, разделив каждую строку, а затем вызвать нужный метод.

Files.lines(filePath)
    .map(l -> l.split(" "))
    .forEach(a -> createGraphe(a[0], a[1], a[2]));
0 голосов
/ 19 ноября 2018

Поскольку вы хотите решить эту проблему и хотите узнать, как потоки могут быть полезны в этой ситуации

  1. Чтение файла (с использованием Java8), при этом вы получите все строки в файле : Stream lines = Files.lines (Paths.get (filePath)) *
  2. Чтение этого файла построчно : lines.map (line -> line.split (pattern)), разделив строку, и вы получите три секции из строки
  3. Передача полученных аргументов в функцию n: forEach (arg -> createGraphe (arg [0], arg [1], arg [2]);

Я надеюсь, что это довольно сложный ответ, если вы хотите этого достичь

0 голосов
/ 19 ноября 2018

Метод lines(), который вы используете, уже делает то, что вы ожидаете.

Java 8 добавил новый метод с именем lines() в классе Files, который можно использовать для чтения строки файластрока в Java.Прелесть этого метода в том, что он читает все строки из файла как поток строк, который заполняется лениво по мере использования потока.Таким образом, если у вас есть огромный файл и вы читаете только первые 100 строк, то остальные строки не будут загружены в память, что приведет к лучшей производительности.

Это немного отличается от метода Files.readAllLines() (которыйчитает все строки в список), потому что этот метод читает файл лениво, только когда терминальная операция вызывается в потоке, например, forEach(), count() и т. д. Используя метод count(), вы можете фактически посчитать количество строк в файлахили количество пустых строк путем фильтрации пустых строк.

Ссылка: https://javarevisited.blogspot.com/2015/07/3-ways-to-read-file-line-by-line-in.html

...