カテゴリー別アーカイブ: 未分類

javaのPathについて調べる

javaにはパスを取り扱うためのクラスとして java.nio.file.Path クラスとしてAPIが用意されています。
この Path クラスは java.io.File クラスと相互変換が可能なように設計されているので、JVM上でファイルやディレクトリを操作する際には主にこれらのクラスを利用することになります。

なお本記事のサンプルコードは基本的にgroovyを用いて確認していますので注意してください。

まずは概要をおさらい

公式ドキュメントの内容を噛み砕きますので、基本的にそちらを参照していただければと思います。

PathクラスのAPIでは一つ一つの構成要素のことをコンポーネントという呼び方をするようです。
例えば /tmp/hoge/fuga.txt というパスが存在したときに、4つのコンポーネントが存在します。

特にルートを表す冒頭の /(スラッシュ)に関してはルートコンポーネントと呼ばれます。
ルートコンポーネントは存在しないこともあります。その場合はシステムのワーキングパスからの相対パスを表現しています。
また tmp, hoge というディレクトリを表すパスコンポーネント及び fuga.txt というファイルを表すパスコンポーネントから成り立っています。
このパスは resolve などのメソッドを利用することで結合することが可能です。

実際に利用する

また java.nio.file.Path はあくまでパスを取り扱うリソースのためのインタフェースの定義となります。
実際に実装で使用するための手っ取り早い方法は java.nio.Paths クラスを用いることです。
PathsクラスにはPath実装のインスタンスを取得するためのstaticメソッドが用意されています(というかそれしか用意されていません)

具体的には先程の例で言うと

Path path = Paths.get("/tmp/hoge/fuga.txt")

などとすることでpathインスタンスを取得することが出来ます。
またのちほど説明しますが、このPathsクラスはあくまでデフォルトのFileSystemへの実装となるので込み入った用途には向きません。

またURIインスタンスを引数として受けとり、Pathへと変換するメソッドも用意されています。
こちらは下記のように使用できます。

URI uri = new URI("file:///tmp/hoge/fuga.txt")
println Paths.get(uri).toAbsolutePath() // -> /tmp/hoge/fuga.txt

もう一つ試しにfile以外のスキームを持つURIを与えてみましょう。

URI uri = new URI("http://google.com/")
println Paths.get(uri).toAbsolutePath()

こちらを実行すると下記のような例外が発生します

Caught: java.nio.file.FileSystemNotFoundException: Provider "http" not installed
java.nio.file.FileSystemNotFoundException: Provider "http" not installed
  at java_nio_file_Paths$get.call(Unknown Source)
  at Hoge.run(Hoge.groovy:8)

先程述べたようにデフォルトのFileSystem実装を利用するため、httpスキームなど知りません。といったような例外が吐き出されます。

さっきから出てくるFileSystemってなんなのさ

java.nio.file.FileSystem についてだんだん気になってきたと思いますのでこちらも調べましょう。
FileSystemはファイルシステムへのインタフェースを提供します。
デフォルトのファイルシステムではJVMからアクセス可能なファイルシステムへのアクセスを提供します。
ですので先程file以外のURIスキームを引数に与えたときに例がが発生したのはこのためですね。

さらにこのFileSystemインスタンスを取得するためには FileSystems というFileSystemのファクトリクラスを用います。

このクラスに定義されたメソッドを用いることで当然デフォルトのファイルシステムを取得することも出来ますし、独自のカスタムファイルシステムを定義することも可能です。

まとめ

あっさりした内容になりましたがPathAPIの周辺情報が確認できました。

参考

Path
java.nio.file.FileSystemFileSystem
FileSystems


ftpクライアントを実装してみる

まとまった時間ができたので、ちょっと前からやろうと思っていましたftp clientの実装に取り組んでみました。

とりあえず形にしようというところまでを着地地点として仕上げたので、本当にftpのみの実装になっています。
引き続きftpsなどの実装を拡張して行きたいと思います。

実装した感じとしては、ftp自体は非常にシンプルなプロトコルだなと。
C実装ではすでにTCP/IPを利用するためのライブラリが豊富に存在するので、ほぼほぼアプリケーションを実装する感覚に近いですね。
ソケットの上にテキストベースのメッセージでやり取りするだけなので。