tokuhirom's Blog

Paths.get(uri) について

Paths.get(uri) で Path オブジェクトを取得可能だが、これはどんな URI をサポートしているのかという話。

結論からいうと file:// 以外での利用は微妙。

file:// 以外の場合、インストール済みのファイルシステムプロバイダの中からサポートしているものを利用することになる。サポートしてるものがなければなにも起きない。

FileSystemProvider.installedProviders() でインストール済みのプロバイダは取得できる。 特に何も jar を読んでいなければ、これは以下のようなものが入っている。

sun.nio.fs.MacOSXFileSystemProvider@4f2410ac
com.sun.nio.zipfs.ZipFileSystemProvider@722c41f4

前者は普通の file system からの読み込みに使うやつで、後者は zip からの読み込み。 zip からの読み込みってことは、zip ファイルの読み込みつまり jar からの読み込みに対応しているのかな?と思いきやこれがそうではない。

jar:file:/Users/tokuhirom/.m2/repository/junit/junit/4.11/junit-4.11.jar!/LICENSE.txt

のような形式をサポートしていることは確かなのだが、実際には ZipFileSystemProvider#newFileSystem であらかじめ jar file を登録しておかないとダメなのでまったく使い物にはならない。

FileSystemProvider の static にデフォルトで導入されている provider はグローバル変数なので、ここにわざわざ導入すると removeFileSystem でまたはずさなくてはならず、あまりやりたくない。

ZipFileSystemProvider 以外でも、サービスローダで登録することによって任意の URL を読み込み可能ではあるが、FileSystemProvider というグローバルなオブジェクトに対してサービスローダでガンガン追加していくというのもあんまり好ましくないように思う。

といったところで、個人的には Paths.get(uri)file:// 以外では利用しないほうが良いように思う。