20

私は現在、私が持っているテキストのみのファイルから行を読み取ろうとしています。Files.lines(..).forEach(..) を使用できる別のスタックオーバーフロー ( Java でプレーン テキスト ファイルを読み取る)で見つけましたが、 for each 関数を使用して行を読み取る方法を実際に理解することはできません。行のテキスト、それを探す場所や方法を知っている人はいますか?

4

5 に答える 5

34

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 args[]) {
        Path path = Paths.of("/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...
        }
    }
    
}
于 2014-04-25T09:24:05.097 に答える
8

次のリストを返すことは避けてください。

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

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

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

Files.lines(path).forEach(System.out::println);
于 2018-09-26T14:54:21.103 に答える
6

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

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
                    .toURI())).forEach(System.out::println);
于 2015-11-17T06:25:11.350 に答える
3

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

これは Java 8 であるため、ラムダ式またはメソッド参照を使用してConsumer引数を指定できます。

于 2014-04-24T18:12:02.393 に答える
2

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

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
于 2016-04-11T07:48:16.233 に答える