PR

今週はjava.io.Fileクラスの新機能をご紹介します。Fileクラスの新機能は以下に示した2つです。

  • パーティションの容量の取得
  • ファイルの属性の取得・変更

まずはパーティションの容量から説明していきます。

パーティションの容量を調べる

パーティションの容量を調べるというのは,UNIXでいうところのdfコマンドと同じ機能です。さっそくサンプルで試してみましょう。

サンプルのソース PartitionSizeSample.java

Fileクラスでは次に示す3種類のパーティションの容量を調べることができます。

表1 Fileクラスで取得できる容量
名称 メソッド名
総容量 getTotalSize()
未使用領域の容量 getFreeSize()
使用可能領域の容量 getUsableSize()

 

    public PartitionSizeSample(String path) {
        File file = new File(path);
 
        System.out.println(file.getPath()
                           + " のパーティションの容量は "
                           + file.getTotalSpace());
        System.out.println(file.getPath()
                           + " のパーティションの未使用領域は "
                           + file.getFreeSpace());
        System.out.println(file.getPath()
                           + " のパーティションの使用可能領域は "
                           + file.getUsableSpace());
    }

さて,実行してみましょう。ここではWindowsで実行しました。

C:\>java PartitionSizeSample D:\
D:\ のパーティションの容量は 52518379520
D:\ のパーティションの未使用領域は 9505112064
D:\ のパーティションの使用可能領域は 9505112064
 
C:\>

さて,実際にこの値は正しいのでしょうか? ファイルエクスプローラで調べてみました。

SimpleDnDへのドロップ動作
図1 Dドライブの容量

正しく,容量が調べられているようです。

今の実行例はDドライブを直接指定していましたが,ファイルやディレクトリでもかまいません。この場合,そのファイルが存在するパーティションの容量を取得できます。

C:\>java PartitionSizeSample D:\temp\zz.txt
D:\temp\zz.txt のパーティションの容量は 52518379520
D:\temp\zz.txt のパーティションの未使用領域は 9505112064
D:\temp\zz.txt のパーティションの使用可能領域は 9505112064
 
C:\>

なお,存在しないバーティションを指定した場合,例外ではなく,すべてのサイズが0になります。

C:\>java PartitionSizeSample Z:\
Z:\ のパーティションの容量は 0
Z:\ のパーティションの未使用領域は 0
Z:\ のパーティションの使用可能領域は 0
 
C:\>

パーティションの容量を調べるための権限がない場合,たとえばアプレットでこれらのメソッドを使用した場合,SecurityException例外が発生します。

ファイルの属性の取得・変更

ファイルの属性とは読み込み可能であるかどうかとか,実行可能であるかどうかなどを表す情報です。

J2SE 5.0では読み込み属性と,書き込み属性を取得することはできました。Java SE 6ではこの2つに加えて,実行できるかどうかを取得でき,また属性の変更も可能になりました。

属性の取得には次の3つのメソッドを使用します。

表2 ファイル属性の取得
属性 メソッド名
読み込み boolean canRead()
書き込み boolean carWrite()
実行 boolean canEcecute()

canExecuteメソッドだけがJava SE 6で導入されたものです。

属性の変更は次に示すメソッドを使用します。

表3 ファイル属性の変更
属性 メソッド名
読み込み boolean setReadable(boolean readable)
boolean setReadable(boolean readable, boolean ownerOnly)
書き込み boolean setWritable(boolean writable)
boolean setWritable(boolean writable, boolean ownerOnly)
実行 boolean setExecutable(boolean executable)
boolean setExecutable(boolean executable, boolean ownerOnly)

それぞれのメソッドはオーバローディングされています。第1引数だけのメソッドは所有者の属性を変更します。第2引数を指定するメソッドはownerOnlyがtrueであれば所有者の属性,falseであれば全員の属性を変更します。

これらのメソッドは属性変更が成功すればtrue,失敗すればfalseが返ります。

それでは,サンプルを使用して確かめてみましょう。

サンプルのソース FileAttributeSample.java

このサンプルは属性をいろいろ変化させてどのように反映させるかを表示しています。たとえば,読み込みの部分であれば,次のように変更しています。

    private void changeReadable(File file) {
        System.out.println("読み込み不可");
        file.setReadable(false);
        ls(file);
 
        System.out.println("読み込み可");
        file.setReadable(false);
        ls(file);
 
        System.out.println("全員 読み込み不可");
        file.setReadable(false, false);
        ls(file);
 
        System.out.println("全員 読み込み可");
        file.setReadable(false, false);
        ls(file);
    }

lsというメソッドは,外部のlsコマンドを呼び出すためのメソッドです。

    private void ls(File file) {
        InputStream stream = null;

        try {
            ProcessBuilder builder 
                = new ProcessBuilder("ls", "-l", file.getPath());
            System.out.println(builder);
            Process process = builder.start();
            process.waitFor();
 
            stream = process.getInputStream();
            while (true) {
                int c = stream.read();
                if (c == -1) {
                    break;
                }
                System.out.print((char)c);
            }
        } catch (InterruptedException ex) {
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch(IOException ex) {}
            }
        }
    }

外部のコマンドを呼び出すためにJ2SE 5.0で導入されたjava.lang.ProcessBuilderクラスを使用しています。

ファイル属性の変化が分かりやすいように,このサンプルはLinuxで実行してみました。

[sakuraba]$ java FileAttributeSample r dummy.txt
初期状態
-rw-r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
読み込み不可
--w-r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
読み込み可
-rw-r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
全員 読み込み不可
--w------- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
全員 読み込み可
-rw-r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
[sakuraba]$ java FileAttributeSample w dummy.txt
初期状態
-rw-r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
書き込み不可
-r--r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
書き込み可
-rw-r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
全員 書き込み不可
-r--r--r-- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
全員 書き込み可
-rw-rw-rw- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
[sakuraba]$ java FileAttributeSample x dummy.txt
初期状態
-rw-rw-rw- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
実行不可
-rw-rw-rw- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
実行可
-rwxrw-rw- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
全員 実行不可
-rw-rw-rw- 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
全員 実行可
-rwxrwxrwx 1 sakuraba sakuraba 1  6月 25 18:03 dummy.txt
[sakuraba]$

ファイル名を表示させたときに左端に表示されるのが属性です。属性は左から所有者,グループ,管理者ごとに表記されています。rと表示されていれば読み込み可ということを示しており,-であれば不可を表します。同様にwは読み込み,xは実行可能性を表しています。

実行してみると,ファイル属性が変化していくのが分かります。

Java SE 6では,今週説明したように,パーティションの容量取得とファイルの属性の取得・変更が行えるようになりました。しかし,まだまだ十分とはいえません。

次のメジャーバージョンアップであるJava SE 7では,ファイルシステムに関する機能が強化される予定です(JSR 203 More New I/O APIs for Java Platform)。

さて,来週はjava.ioパッケージに新しく導入されたConsoleクラスを紹介します。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

5月の今月の櫻庭でツバメのことを書きました。その後,4羽のヒナが生まれ,成長し,巣立ちしてしまいました。もちろん自分が飼っていたわけではありませんが,巣立ちしてしまった後は一抹の寂しさを感じていました。

ところが,その巣のそばにもう1つツバメの巣があることを最近発見しました。こちらの巣はまだ卵を温めているところです。通勤途中にツバメの様子をうかがうのが,毎日の日課になっています。

生まれてすぐの頃 羽が抜け替わりだす もうすぐ巣立ち
生まれてすぐの頃 羽が抜け替わりだす もうすぐ巣立ち