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