私は現在、私が持っているテキストのみのファイルから行を読み取ろうとしています。Files.lines(..).forEach(..) を使用できる別のスタックオーバーフロー ( Java でプレーン テキスト ファイルを読み取る)で見つけましたが、 for each 関数を使用して行を読み取る方法を実際に理解することはできません。行のテキスト、それを探す場所や方法を知っている人はいますか?
5 に答える
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...
}
}
}
次のリストを返すことは避けてください。
List<String> lines = Files.readAllLines(path); //WARN
が呼び出されるとファイル全体が読み取らFiles::readAllLines
れ、結果の String 配列がファイルのすべての内容を一度にメモリに格納することに注意してください。したがって、ファイルが非常に大きい場合、OutOfMemoryError
すべてをメモリにロードしようとする場合があります。
代わりにストリームを使用してください:オブジェクトFiles.lines(Path)
を返すメソッドを使用Stream<String>
し、この同じ問題に悩まされることはありません。ファイルの内容は遅延して読み取られ、処理されます。つまり、ファイルのごく一部のみが常にメモリに格納されます。
Files.lines(path).forEach(System.out::println);
Java 8では、ファイルが に存在する場合classpath
:
Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
.toURI())).forEach(System.out::println);
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