1. 概要

何らかの形式の入力(たとえば、ファイル)を使用することは、すべての開発者にとって重要なことです。 Javaはすでにファイルを操作するいくつかの方法を提供していますが、Kotlinはこの機能を拡張して、ファイルツリーをより簡単にトラバースできるようにします。

このクイックチュートリアルでは、標準のKotlinメソッドを使用して、ディレクトリツリー内のすべてのファイルを再帰的に一覧表示する方法を学習します。

2. ファイルを再帰的にリストする

Kotlinは、ファイルツリーをナビゲートするために使用できる3つの拡張メソッド walk() walkTopDown()、および walkBottomUp()を追加します。

これらについては後で詳しく説明しますが、最初に、それらが呼び出すクラスFileTreeWalkを確認することが重要です。

2.1. FileTreeWalk

3つの方法のどちらを選択しても、それらはすべて、その下にあるFileTreeWalkを使用して作業を行います。

クラス自体には2つの重要な特徴があります。 まず、コンストラクターは private であるため、このクラスを使用できる唯一の方法は、前述のメソッドを使用することです。

第二に、そしてより重要なことに、それは順序つまり、Kotlinが提供するすべての反復法(mapやforEachなど)を自由に使用できます。

FileTreeWalk は、ディレクトリ内のすべてのファイルをトップダウンとボトムアップで反復処理できる2つのトラバーサルメソッドを実装しています。 どちらも深さ優先探索であり、主な違いは、ファイルの前または後にディレクトリにアクセスするかどうかです。

次のセクションの例を見ると、その違いが何を意味するのかを理解するのは簡単です。

2.2. ウォークメソッド

Kotlinによって公開される主なファイルツリートラバーサルメソッドはwalkです。

public fun File.walk(direction: FileWalkDirection = FileWalkDirection.TOP_DOWN): FileTreeWalk 
  = FileTreeWalk(this, direction)

これはJavaのFileクラスの拡張メソッドであり、デフォルトではトップダウンの反復を実行します

次のファイル構造があるとしましょう。

src/test/resources
├── one-in
│   ├── empty-folder
│   ├── one-in-file.md
│   └── two-in
│       ├── two-in-1.md
│       └── two-in-2.md
└── root-file.md

walk を使用してこの構造を調べると、次のようになります。

File("src/test/resources").walk().forEach {
    println(it)
}

次の出力が表示されます。

src/test/resources
src/test/resources/root-file.md
src/test/resources/one-in
src/test/resources/one-in/one-in-file.md
src/test/resources/one-in/empty-folder
src/test/resources/one-in/two-in
src/test/resources/one-in/two-in/two-in-2.md
src/test/resources/one-in/two-in/two-in-1.md

それでは、歩行方向をボトムアップに変更しましょう。

File("src/test/resources").walk(FileWalkDirection.BOTTOM_UP).forEach {
    println(it)
}

実行すると、別の出力が表示されます。

src/test/resources/root-file.md
src/test/resources/one-in/one-in-file.md
src/test/resources/one-in/empty-folder
src/test/resources/one-in/two-in/two-in-2.md
src/test/resources/one-in/two-in/two-in-1.md
src/test/resources/one-in/two-in
src/test/resources/one-in
src/test/resources

トップダウントラバーサルでは、最初に walk がディレクトリにアクセスし、後でファイルにアクセスします。ボトムアップトラバーサルでは、 walk が最初にファイルにアクセスし、後でディレクトリにアクセスします。

walk パラメーターとして列挙型を渡すことは、最も美しい光景ではありません。 ありがたいことに、 walk を使用するたびに、FileWalkDirectionを手動で提供する必要はありません。 いつものように、Kotlinはいくつかの便利な速記を提供します。

2.3. 速記

Kotlinは、 walk の2つの便利な(そしてより読みやすい)省略形を提供します— walkTopDownwalkBottomUp

File("src/test/resources").walkTopDown().forEach {
    println(it)
}

File("src/test/resources").walkBottomUp().forEach {
    println(it)
}

最初はデフォルトのトップダウンモードでwalkを実行し、2番目はボトムアップモードでwalkを実行します。

3. 結論

この記事では、Kotlinがファイルツリーを簡単にナビゲートするのにどのように役立つかを見てきました。

記事コードは、通常どおり、GitHubから入手できます。