NIO2と戯れる

今回は久しぶりにJava7ネタで行こうと思います。Java7でNIOが大幅に改善されNIO2として新たな機能が追加されているようです。調べてみると結構いろいろ追加があってまだ全部調べきれてないけど今回は基本的な部分を紹介します。

説明をだらだら書いてもしょうがないので以前紹介したtry-with-resourceのサンプルをnio2のクラスを利用したコードに修正したサンプルを示します。

Path path = Paths.get("C://work/・・・/test.txt");
System.out.println("We are reading " + path.toUri() + " file.");
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Pathsはファイルやディレクトリを表すPathを生成するためのファクトリクラスでgetPathメソッドでファイル名(絶対パス)を指定しPathオブジェクトを生成します。
このPathクラスはファイルシステム上にあるオブジェクト(ここではtest.txtファイル)を表しています。次に Files.newBufferedReaderでBufferedReaderを生成する際に第1引数に先に作成したPathのインスタンスを渡しています。第2引数は文字コードです。
(さらっと説明意ましたがFilesもJava7で追加になったクラスで、ファイルやディレクトリを操作するためのstaticメソッドが定義されたクラスです。シンボリックリンクを作成するメソッドや権限情報を取得するメソッド等も定義されています。)

これでBufferedReaderはPathが表すファイルに対して読み込みが可能となります。

実行結果はただ単にtext.txtの内容がコンソールに出力されるだけなのですが・・・。

上記コードではPathの生成にPathsクラスを利用しましたがFileSystemを利用することも可能です。

FileSystem fileSystem = FileSystems.getDefault();
Path path = fileSystem.getPath("test.txt");

FileSystemsクラスはFileSystemを生成するファクトリでgetDefaultメソッドでカレンドディレクトリを示すFileSystemクラスを返します。生成したFileSystemのgetPathメソッドでファイル名を指定するとカレントディレクトリにあるtest.txtファイルを示すPathオブジェクトを返します。

FileSystemクラスはファイルシステムへのインターフェースを提供し、Pathはファイルシステム上のオブジェクト(ファイル、ディレクトリ)を表すインターフェースというべきでしょうか。FileSystem、Path共にスレッドセーフのようです。

ここでもう一つFileSystemクラスにはgetFileStoresメソッドがあり、このメソッドはFileStoreクラスをIterableで返します。

このFileStoreはどうやらファイルのストレージを表すクラスのようで例えば次のコードを実行すると実行環境のストレージに係る情報が取得できます。

try {
    for(FileStore store : fileSystem.getFileStores()) {
        System.out.println(store.name() + " " + store.type() + " "+ (store.getTotalSpace() / 1024/ 1024));
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

かなり強引なコードですが、サンプルなので・・・。実行結果にはストレージの情報が表示されていると思います。
実行環境がWindowなら以下のような出力から始まって何行か似たような文字列が出力されるのではないでしょうか。

OS NTFS ・・・

FileStoreについての詳細はJavaDocを参照してください。

NIO2でファイルシステムに対する制御の仕組みが改善・拡張されているので、今後はNIO2で追加になった機能を主に利用していくことになるかと思います。