T
- そのイテレータで返される要素の型public interface DirectoryStream<T> extends Closeable, Iterable<T>
DirectoryStream
は Iterable
を拡張しますが、それがサポートする Iterator
は 1 つだけなので、それは汎用の Iterable
ではありません。つまり、iterator
メソッドを呼び出して、2 つめまたはそれに続くイテレータを取得すると、IllegalStateException
がスローされます。
ディレクトリストリームの Iterator
の重要な特性の 1 つに、その hasNext
メソッドが要素を 1 つ以上先読みすることが保証されていることがあります。hasNext
メソッドが true
を返し、それに続いて next
メソッドが呼び出された場合、入出力エラーが発生したり、ストリームが closed
されたりしても、next
メソッドは例外をスローしないことが保証されています。Iterator
は remove
操作をサポートしていません。
DirectoryStream
は作成時にオープンされ、close
メソッドを呼び出すことでクローズされます。ディレクトリストリームをクローズすると、そのストリームに関連付けられたリソースがすべて解放されます。ストリームのクローズに失敗すると、リソースリークが発生することがあります。try-with-resources 文は、確実にストリームがクローズされるようにする役立つ構文を提供します。
Path dir = ... try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) { for (Path entry: stream) { ... } }
ディレクトリストリームがクローズされたあとで、Iterator
を使用してそのディレクトリにさらにアクセスすると、ストリームの終わりに達したかのような動作をします。Iterator
は、先読みが原因で、ディレクトリストリームがクローズされたあとに 1 つまたは複数の要素を返すことがあります。バッファーに入っているこれらの要素が読み取られると、後続の hasNext
メソッドの呼び出しで false
が返され、それに続く next
メソッドの呼び出しで NoSuchElementException
がスローされます。
ディレクトリストリームは、非同期クローズ可能である必要はありません。ディレクトリからの読み取りを行なっているディレクトリストリームのイテレータで、あるスレッドがブロックされているときに、別のスレッドが close
メソッドを呼び出した場合、2 つめのスレッドは読み取り操作が完了するまでブロックされる可能性があります。
ディレクトリへのアクセス時に入出力エラーが検出された場合は、それによって Iterator
の hasNext
または next
メソッドは IOException
を原因とした DirectoryIteratorException
をスローします。前述したように、hasNext
メソッドは要素を 1 つ以上先読みすることが保証されています。これは、hasNext
メソッドが true
を返し、それに続いて next
メソッドが呼び出された場合に、next
メソッドが DirectoryIteratorException
では失敗しないことが保証されていることを意味します。
イテレータによって返される要素に決まった順序はありません。一部のファイルシステムでは、ディレクトリ自体やディレクトリの親ディレクトリへの特殊なリンクを保持しています。これらのリンクを表すエントリはイテレータによって返されません。
イテレータは、弱一貫性を保持します。それはスレッドセーフですが、反復処理中にディレクトリをフリーズしないため、DirectoryStream
の作成後に行われる更新がディレクトリに反映されることも反映されないこともあります。
使用例: ディレクトリ内のソースファイルの一覧が必要であるとします。この例では、for-each 構文と try-with-resources 構文の両方を使用します。
List<Path> listSourceFiles(Path dir) throws IOException { List<Path> result = new ArrayList<>(); try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{c,h,cpp,hpp,java}")) { for (Path entry: stream) { result.add(entry); } } catch (DirectoryIteratorException ex) { // I/O error encounted during the iteration, the cause is an IOException throw ex.getCause(); } return result; }
Files.newDirectoryStream(Path)
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.