<AI>
Javaで指定したフォルダ以下のファイルとサブフォルダを再帰的に取得するには、
Java NIOの Files.walk メソッドを使用するのが最も簡潔で推奨される方法です。
これをJavaFXの ListView などに表示するには、取得したパスのリストをUIの要素に変換して渡します。
具体的な実装コードは以下のようになります。
サンプルコード(指定フォルダ以下のファイルを再帰的に取得しListViewに表示)
java
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
public class FileViewerApp extends Application {
@Override
public void start(Stage primaryStage) {
// 表示したい親フォルダのパスを指定
Path rootDir = Paths.get("C:/your/target/folder");
ListView listView = new ListView<>();
ObservableList fileList = FXCollections.observableArrayList();
try {
// Files.walkでサブフォルダを再帰的に探索し、ファイル名をリストに追加
fileList.addAll(
Files.walk(rootDir)
.filter(Files::isRegularFile) // ファイルのみに絞り込む(フォルダは除外)
.map(Path::toString) // パス文字列に変換
.collect(Collectors.toList())
);
} catch (IOException e) {
e.printStackTrace();
}
listView.setItems(fileList);
VBox root = new VBox(listView);
Scene scene = new Scene(root, 400, 300);
primaryStage.setTitle("再帰的ファイルビューア");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ポイント
Files.walk(): 指定したフォルダ(ルートディレクトリ)以下のすべてのファイル・ディレクトリを深さ優先で辿り、Stream として返します。
.filter(Files::isRegularFile): 再帰的に取得された要素の中から、ディレクトリ(フォルダ)を除外して実際のファイルのみを抽出します。
ListView への登録: 取得した Path を必要に応じて文字列(絶対パスや相対パス)に変換し、JavaFXの ObservableList に格納して ListView にセットしています。
もしエクスプローラーのように階層構造(ツリー)のまま TreeView に表示したい場合は、
公式の TreeView (JavaFX 8) をベースにした再帰メソッドを用いて、TreeItem の子要素として追加していく実装 が一般的です。