2012年6月8日金曜日

Java NIO2 をいじろう - その1

こんにちわ。みけです。

Java6のEOLが今年(2012年)の11月に迫っています。

なので、Java6を使っている人はJava7に切り替え始めましょう。

Javaの最新7の5分の1のバージョンを使っている人(つまりJava1.4を使っている人)はとっととアップデートして下さい。

Java1.4のEOLは2008年10月30日です。

Sunと契約している場合を除いて、契約していない人たちは泣き言を言わずアップデートしましょう。


本題


さて、Java7になってから登場したNIO2をちょっといじってみたいと思います。

NIO2によって、Javaではいままで扱えなかったシンボリックリンクとか、ファイルの更新日付とか、ファイルパーミッションとかが扱えるようになりました。

その中心にあるのはPathインターフェースです。

というわけで、Pathインターフェースについて、ちょっとおさらいします。

java.nio.file.Path


まあ、PathのJavadocを見ればだいたい分かるんですが、

どういう値が返ってきているかわからないので、1つずつ試してみましょう。

C:\Users\mike>groovysh
Groovy Shell (1.8.6, JVM: 1.7.0_02)
Type 'help' or '\h' for help.
-----------------------------------------------------------
groovy:000> home = System.env['HOMEPATH']
===> \Users\mike
groovy:000> dir = new File(home)
===> \Users\mike
groovy:000> path = dir.toPath()
===> \Users\mike
groovy:000> path.class
===> class sun.nio.fs.WindowsPath

まず、Pathはインターフェースなのでnew演算子でインスタンス化することは出来ません。

というわけで、java.io.File#toPath()からインスタンスを取得します。

Windows7で実行していますが、実体はsun.nio.fs.WindowsPathです。


メソッド


では、ひとつずつメソッドを確認して行きましょう。

getFileName()

Pathの名前を返します。

groovy:000> path.fileName
===> mike

getName(int index)getNameCount()

getNameCountPathを構成するPathの要素数を返します。

getNameは引数で指定された位置のPathの名前を返します。

groovy:000> Integer.metaClass.define {
groovy:001>     collect = {Closure c ->
groovy:002>         def collection = []
groovy:003>         delegate.times {
groovy:004>             collection << c(it)
groovy:005>         }
groovy:006>         return collection
groovy:007>     }
groovy:008> }
===> groovy.lang.ExpandoMetaClass@65ad9b63[class java.lang.Integer]
groovy:000> path.nameCount.collect { path.getName(it) }
===> [Users, mike]

getParent()getRoot()

まあ、名前のとおりです。

groovy:000> path.parent
===> \Users
groovy:000> path.root
===> \

isAbsolute()toAbsolutePath()

isAbsolute()はOS用のちゃんとしたPath名であるか判断します。

toAbsolutePath()はまた、OS用のちゃんとしたPath名を取得します。

プロジェクトなどでsrc/main/resourcesとやった場合などに使えそうですね。

groovy:000> path.absolute
===> false
groovy:000> path.toAbsolutePath()
===> C:\Users\mike

続きは、その2で。

0 件のコメント:

コメントを投稿