Java 8では、Stream(AutoCloseable)は再利用できません。一度使用または使用されると、ストリームは閉じられます。したがって、リソースを試して試して宣言するユーティリティは何ですか? try-と資源の文とtry-with-resourcesステートメントを使用してStreamを宣言するかどうかの違いは何ですか?
例:
public static void main(String[] args) throws IOException {
try (Stream<Path> entries
= Files.walk(Paths.get("."), 4, FileVisitOption.FOLLOW_LINKS)) {
entries.forEach(x -> System.out.println(x.toAbsolutePath()));// the entries stream will be automatically closed at this point
//..
System.out.println("Still in the Try Block");
} //The entries will be closed again because it is declared in the try-with-resources statement
}
そして、ここでのtry catchブロック
public static void main(String[] args) throws IOException {
Stream<Path> entries = Files.walk(Paths.get("."), 4, FileVisitOption.FOLLOW_LINKS);
entries.forEach(x -> System.out.println(x.toAbsolutePath()));// the entries stream will be automatically closed at this point
System.out.println("Is there a risk of resources leak ?");
}
より安全なものですなしで同じ例?
ここ新しいコード::私は、ストリームがクローズされたかどう確認するために私のコードを更新するいくつかの回答後
public static void main(String[] args) throws IOException {
resourceWithTry();
resourceWithoutTry();
}
private static void resourceWithTry() throws IOException {
try (Stream<Path> entries
= Files.walk(Paths.get("."), 4, FileVisitOption.FOLLOW_LINKS).onClose(() -> System.out.println("The Stream is closed"))) {
entries.forEach(x -> System.out.println(x.toAbsolutePath()));// the entries stream will be not automatically closed at this point
System.out.println("Still in the Try Block");
} //The entries will be closed again because it is declared in the try-with-resources statement
}
private static void resourceWithoutTry() throws IOException {
Stream<Path> entries
= Files.walk(Paths.get("."), 4, FileVisitOption.FOLLOW_LINKS).onClose(() -> System.out.println("Without Try: The Stream is closed"));
entries.forEach(x -> System.out.println(x.toAbsolutePath()));// the entries stream will be not automatically closed at this point
System.out.println("Still in the Try Block");
}
私の投稿を更新しました。ストリームが閉じられているかどうかを確認するための新しいコードを追加しました。ありがとうございました – Aguid
もっと正確には、両方のケース(IOストリームまたはコレクションストリーム)では、例のようにメソッド呼び出しのケースで、ストリームインスタンスは**メソッドの戻り後に**パージ**されます(実際にはGCアクション。メソッドの呼び出しは、スタックのリターン後に破棄されます)。また、メソッド中に例外がスローされたかどうかにかかわらず、スタック上のローカル変数はパージされます。 (1/2) – davidxxx
これらの違いは、リソース(IO)を使用するストリームがファイルをロックしたり接続を維持したりするメソッドを呼び出すということです。この特定のケースでは、リソースの戻り値を操作するメソッドとして、これらのクローズ可能なリソースの潜在的なロックをすべて削除したことを確認します(2/2) – davidxxx