見出し画像

Apache Commons VFS のすすめ (3)

はじめに

Commons VFS には「Virtual File System」という機能が存在します。

Commons VFS の VFS も Virtual File System の略称ですが、「Virtual File System」は Commons VFS にある機能としての「Virtual File System」です。

今回はこの「Virtual File System」と言う機能について紹介してみようと思います。

Commons VFS の基本的な機能については、前回までの記事で説明しておりますので、参照してください。

Apache Commons VFS のすすめ (1)
Apache Commons VFS のすすめ (2)

Virtual File System とは

「Virtual File System」とは Commons VFS に実装されている機能で、好きなファイルシステムのパスから仮想ツリーを作成する機能です。

ファイルツリー上に別のファイルシステムのパスをジャンクションとして接続し、仮想のファイルシステムツリーを構築します。
接続するパスは、ファイルでもディレクトリでも構いません。

この機能を使用すると、複数の異なるファイルシステムを一つのファイルシステムツリー上に混在させることが出来ます。

構築イメージ

このように、表向きは一つのファイルシステムツリーに見せつつ内部では別の場所を参照するという目的で使えます。

使い方

作成

Virtual File System の構築は FileSystemManager から作成し、ジャンクションを追加して行います。

作成関数は以下の関数があります。

FileObject createVirtualFileSystem(FileObject rootFile)
指定のパスをルートとして Virtual File System を作成します。

構成イメージ

作成された FileSystem のスキーマは渡した FileObject のスキーマと同じになります。

// ルートとなるファイルパス
FileObject file = manager.resolveFile("file:///C:/Users");

// 仮想ファイルシステムの作成
// このファイルシステムの URI は "file://***" となる。
FileSystem fileSystem = manager.createVirtualFileSystem(file)
    .getFileSystem();

// Virtual Sile System 上では親パスが存在しない。
FileObject root = fileSystem.resolveFile("/");
if (root.getParent() == null) {
  :
}

ルートが渡した FileObject のパスに繋がっているため、ジャンクションの追加は出来ません。
これは、ジャンクションの中に更にジャンクションを接続することが出来ないためです。

このため、この関数で作成する Virtual File System は指定した FileObject 以下だけを参照するなどと言った目的のために使用出来ます。

FileObject createVirtualFileSystem(String rootUri)
指定の URI で Virtual File System を作成します。
パスの接続には、ジャンクションを追加して行います。

構成イメージ

URI のスキーマは好きなスキーマを指定出来、作成した FileSystem のスキーマがそのスキーマになります。

この関数で作成した Virtual File System は好きなパスに別のファイルシステムのパスをジャンクションとして接続し、複数のファイルシステムを混ぜたファイルシステムツリーを作成することが出来ます。

ジャンクションを作成するには、ジャンクションのパスとそのパスに対応させる FileObject を FileSystem#addJunction(String, FileObject) に渡して作成します。

// 仮想ファイルシステムの作成
// このファイルシステムの URI は "vfs-sample://***" となる。
FileSystem fileSystem = manager.createVirtualFileSystem("vfs-sample://")
    .getFileSystem();

// "/commons""ftp://example.com/commons" を接続
FileObject commons = manager.resolveFile("ftp://example.com/commons");
fileSystem.addJunction("/commons", commons);

// "/local/users" にローカルパスの "file:///C:/Users" を接続
FileObject users = manager.resolveFile("file:///C:/Users");
fileSystem.addJunction("/local/users", users);

// ルートを取得して子供をリストアップ
FileObject root = fileSystem.resolveFile("/");
// "commons""local" がリストアップされる。
// "/local/users""local" の子供を取得すると取得出来る。
for (FileObject child : root.getChildren()) {
  :
}

ジャンクションは深い階層に作成することも可能です。
例えば、"/local/users" にジャンクションを作成した場合、ルートから見ると "local" というフォルダが存在し、その中にジャンクションとなっている "users" フォルダがあるように見えます。

この "local" フォルダは、Virtual File System 自体のフォルダとなり、どのパスにも繋がっていないフォルダとなります。
ただし、このフォルダは実態のないただの入れ物としてのフォルダとなるため、最終更新日時などの情報を取得しようとするとエラーになります。

また、もう一つの関数で言及したように入れ子のジャンクションは作成出来ません。
つまり、上記のサンプルでは "/commons" や "/local/users" は既に別のファイルシステムが接続しているため、"/commons" 配下の "/commons/temp" などに更に別のファイルシステムを接続して合成させることは出来ません。

使用

Virtual File System を使用するには、構築した後、初期化した FileSystem を保持し続けて使用するか、あるいは、FileSystem からルートの FileObject を取得して使用することになります。

作成した Virtual File System の FileSystem は FileSystemManager から取得し直すことが出来ません。

このため、初期化した FileSystem を保持し続けて使用するか、あるいは、ルートの FileObject を持ち回って使用することかになります。

なお、FileSystemManager#createVirtualFileSystem(String rootUri) が返した FileObject は Virtual File System のファイルツリーを参照出来ません。
構築対象の FileSystem を取得するための一時的なものと割り切って、ちゃんとしたルートの FileObject は構築した FileSystem から取得するようにしましょう。

FileSystem fileSystem = manager.createVirtualFileSystem("vfs-sample://")
    .getFileSystem();

  :

// ルート
FileObject root = fileSystem.resolveFile("/");

解放

使わなくなった Virtual File System の FileSystem は解放した方が良いです。
解放処理は、FileSystemManager#closeFileSystem() に Virtual File System の FileSystem を渡すことで、解放処理を行うことが出来ます。

FileSystem fileSystem = manager.createVirtualFileSystem("vfs-sample://")
    .getFileSystem();

  :

// 解放
manager.closeFileSystem(fileSystem);

まとめ

Virtual File System を使用すると、既存のファイルシステムから好きなファイルツリーを構成することが出来ます。

複数のファイルシステムにまたがってアクセスすることはあまりないかもしれませんが、面白い機能だと思いますので、触ってみることをお勧めします。

次回は・・・

今回は Virtual File System 機能を紹介いたしました。

次回の記事では望みのファイルシステムに VFS でアクセス出来るように FileProvider を作成する手順を紹介いたします。

お楽しみに。

#プログラミング #Java #Apache #エンジニア#ITエンジニア#開発#ウイングアーク#ウイングアーク1st#テックブログ#エンジニア転職#エンジニア採用


この記事が気に入ったらサポートをしてみませんか?