web-dev-qa-db-ja.com

Files.lines(...)。forEach(...)でファイルから読み取る方法は?

現在、私が持っているテキストのみのファイルから行を読み取ろうとしています。私は別のstackoverflow( Javaでプレーンテキストファイルを読む )でFiles.lines(..)。forEach(..)を使用できることを発見しましたが、実際に使用方法を理解することはできません行ごとにテキストを読み取る関数ごとに、それをどこで探すか、どのように行うかを誰もが知っていますか?

15
user3570058

Test.txtのサンプルコンテンツ

_Hello
Stack
Over
Flow
com
_

lines()およびforEach()メソッドを使用してこのテキストファイルから読み取るコード。

_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 FileLambda {

    public static void main(String JavaLatte[]) {
        Path path = Paths.get("/root/test.txt");
        try (Stream<String> lines = Files.lines(path)) {
            lines.forEach(s -> System.out.println(s));
        } catch (IOException ex) {
          // do something or re-throw...
        }
    }
}
_
27
pardeep131085

Java 8では、ファイルがclasspathに存在する場合:

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
                    .toURI())).forEach(System.out::println);
4
Arpit

次を使用してリストを返さないでください。

_List<String> lines = Files.readAllLines(path); //WARN
_

_Files::readAllLines_が呼び出されたときにファイル全体が読み取られることに注意してください。結果の文字列配列は、ファイルのすべての内容を一度にメモリに格納します。したがって、ファイルが非常に大きい場合、OutOfMemoryErrorがすべてをメモリにロードしようとすることがあります。

代わりにストリームを使用します:_Stream<String>_オブジェクトを返すFiles.lines(Path)メソッドを使用します。この問題は発生しません。ファイルの内容は遅延して読み取られ、処理されます。つまり、ファイルのごく一部のみがいつでもメモリに格納されます。

_Files.lines(path).forEach(System.out::println);
_
3
Imar

Files.lines(Path)Path引数を想定し、_Stream<String>_を返します。 Stream#forEach(Consumer) は、Consumer引数が必要です。したがって、メソッドを呼び出して、 Consumer を渡します。そのオブジェクトは、各行に必要なことを行うために実装する必要があります。

これはJava 8なので、ラムダ式またはメソッド参照を使用してConsumer引数を提供できます。

サンプルを作成しました。ストリームを使用してフィルタリング/

public class ReadFileLines {
    public static void main(String[] args) throws IOException {
        Stream<String> lines = Files.lines(Paths.get("C:/SelfStudy/Input.txt"));
//      System.out.println(lines.filter(str -> str.contains("SELECT")).count());

//Stream gets closed once you have run the count method.
        System.out.println(lines.parallel().filter(str -> str.contains("Delete")).count());
    }
}

サンプルinput.txt。

SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
1
Kumar Abhishek