Javaでファイルかディレクトリかを調べる方法 (isFile, isDirectory)

isfile
  • このエントリーをはてなブックマークに追加
  • Pocket

Javaでローカルファイルがファイルかディレクトリかを調べるには、FileクラスのisFileやisDirectoryを使えばいい。

このページではそれぞれの基本的な使い方と、サンプルプログラムを用意してみた。使い方の参考にしてほしい。

Javaのファイルとディレクトリの調べ方

調べるためのメソッド

Fileクラスは、ファイルとディレクトリの両方を抽象パス名で扱っている。区別されてないのだ。

このため、コードを見ただけでは分からない場合がある。こんなときのために、ファイルかディレクトリかを調べるためのメソッドが用意されている。

ファイルとディレクトリは違う

Fileクラスにはファイルもディレクトリも同じように扱うことのできる共通メソッドがある。しかし、対象がファイルかディレクトリによって、メソッドに違いがある。

例えば、削除だ。ファイルは中身が空でなくても削除できるが、ディレクトリは中身が空の時だけ削除できる。

listメソッドなども抽象パスがディレクトリをでなければならない。その他にもあるので、注意してほしい。

メソッド

ファイルかディレクトリかを調べるために用意されているふたつのメソッドの詳細を見てみよう。

ファイルか調べるisFile()

ファイルかを調べるのはisFileメソッドだ。

isFile()

戻り値の型

public boolean

内容

抽象パス名によって示されたファイルが、普通のファイルかどうかを調べる。ファイルがディレクトリでなくて、システムに依存する基準を満たしていれば、普通のファイルである。Javaアプリケーションによって作られたどんなディレクトリでないファイルは、普通のファイルであることが保証されている。

ファイルが普通のファイルでないことをI/O例外と区別したい場合や、同じファイルのいくつかの属性が同時に要求される場合は、Files.readAttributesメソッドが使用できるかもしれない。

戻り値:true - 抽象パス名で示されたファイルが存在し、かつ普通のファイルであるならば。false – それ以外。

SecurityException – もし、セキュリティマネジャーが存在して、itsSecurityManager.checkRead(java.lang.String)メソッドがそのファイルかディレクトリの読み込み・アクセスを拒否したならば。

ディレクトリかを調べるisDirectory()

ディレクトリかを調べるにはisDirectoryメソッドを使う。

isDirectory()

戻り値の型

public boolean

内容

抽象パス名によって示されたファイルが、ディレクトリかどうかを調べる。

ファイルがディレクトリでないことをI/O例外と区別したい場合や、同じファイルのいくつかの属性が同時に要求される場合は、Files.readAttributesメソッドが使用できるかもしれない。

戻り値:true - 抽象パス名で示されたファイルが存在し、かつディレクトリであるならば。false – それ以外。

SecurityException – もし、セキュリティマネジャーが存在して、itsSecurityManager.checkRead(java.lang.String)メソッドがそのファイルかディレクトリの読み込み・アクセスを拒否したならば。

ディレクトリの内容を調べる

また、listFiles()を使うと、名前の一覧を取得するのではなく、ディレクトリに含まれるファイルやディレクトリを一覧として取得できる。

listFiles()

戻り値の型

public File[]

内容

抽象パス名で示されたディレクトリ内のファイル群を表す抽象パス名の配列を戻す。

もし、この抽象パス名がディレクトリを示していないなら、このメソッドはnullを返す。そうでなければ、Fileオブジェクトの配列が戻される。そして、それらの要素のひとつひとつがディレクトリ内の各々のファイルかディレクトリに対応している。ディレクトリそのものを示しているパス名とディレクトリの親ディレクトリは結果に含まれない。各々の結果としての抽象パス名は、File(File, String)コンストラクタを使用して生成される。従って、もしこのパス名が絶対であれば、各々の結果としてのパス名も絶対となる。もしこのパス名が相対であれば、各々の結果としてのパス名も同じディレクトリの相対となる。

結果としての配列中の名前文字列が何らかの仕様に基づく順序となることは保証されていない。つまり、特にアルファベット順になるということは保証されていない。

考慮点:Filesクラスは、ディレクトリやディレクトリ内のファイル群を繰り返し操作するためにnewDirectoryStreamメソッドを定義している。これは、大きなディレクトリを操作する場合に、資源を節約するかもしれない。

 

戻り値:抽象パス名で示されたディレクトリ内のファイル群を表す抽象パス名の配列を戻す。ディレクトリが空であれば、配列も空である。もし、この抽象パス名がディレクトリを表現していないならば、nullを戻す。

 

SecurityException – もし、セキュリティマネジャーが存在して、itsSecurityManager.checkRead(java.lang.String)メソッドがそのファイルかディレクトリの読み込み・アクセスを拒否したならば。

 

以降:1.2

ディレクトリ内を調べるサンプルプログラム

それでは実際にサンプルプログラムを確認してみよう。

WindowsのC:ドライブのディレクトリ:C:\temp\abcに以下のようなファイルやフォルダがある。このとき、プログラムはディレクトリに含まれている内容を調べ、すべての内容物についてファイルなのか、それともディレクトリかを表示する。

Javaディレクトリ

import java.io.File;

public class TestWhetherFileOrDirectory {
    public static void main(String[] args) {
        String pathname = "C:\\temp\\abc";//[1]
        File file = new File(pathname);//[2]

        File[] files = file.listFiles();//[3]
        for (int index = 0; index < files.length; index ++) {//[4]
            File item = files[index];//[5]

            if (item.isDirectory()) {//[6]
                System.out.println("[7][" + item.getName() + "]はディレクトリです");
                continue;//[8]
            }
            if (item.isFile()) {//[9]
                System.out.println("[10][" + item.getName() + "]はファイルです");
                continue;//[11]
            }
            System.out.println("[12][" + pathname + "]はディレクトリでもファイルでもありません");
        }
    }
} 

実行結果

[7] [Directory001]はディレクトリです
[7] [Directory002]はディレクトリです
[10] [File001.txt]はファイルです
[10] [File002.txt]はファイルです

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] 文字列pathnameにディレクトリのパスと名前を設定する。
  • [2] Fileクラスからpathnameをパス名に持つfileインスタンスを生成する。
  • [3] ディレクトリの内容を配列:filesとして取得する。
  • [4] 配列:filesに含まれる要素の数だけループを繰り返す。
  • [5] 配列の要素を取り出す。
  • [6] 配列の要素がディレクトリかを調べる。
  • [7] 要素がディレクトリであることを表示する。
  • [8] ループの先頭に戻る。
  • [9] 配列の要素がファイルかを調べる。
  • [10] 要素がファイルであることを表示する。
  • [11] ループの先頭に戻る。
  • [12] ファイルでもディレクトリでもないことを表示する。

ディレクトリを削除するサンプルプログラム

ディレクトリを削除しようとしても、空でないディレクトリは削除できない。

この問題を解決するために、このプログラムはディレクトリが空であることを調べてから、削除を行っている。

現実のプログラムでは、さらに抽象パス名がディレクトリかを調べてることも必要になるが、ここではシンプルにするために省いている。

import java.io.File;

public class DirectoryDelete {
    public static void main(String[] args) {
        String pathname = "C:\\temp\\abx";//[1]
        File file = new File(pathname);//[2]

        File[] files = file.listFiles();//[3]
        if (files.length > 0) {//[4]
            System.out.println("[10]ディレクトリ:[" + pathname + "]は空でないので、削除できません");
            return;//[8]
        }
        if (file.delete()) {//[7]
            System.out.println("[8]ファイル:[" + pathname + "]の削除に成功しました");
            return;//[9]
        }
        System.out.println("[10]ファイル:[" + pathname + "]の削除に失敗しました");
    }
}

実行結果

条件1:ディレクトリ:C:\temp\abcが空でない。
[5]ディレクトリ:[C:\temp\abc]は空でないので、削除できません
条件2:ディレクトリ:C:\temp\abcが空である。
[8]ファイル:[C:\temp\abc]の削除に成功しました
条件3:ディレクトリ:C:\temp\abcにコマンドプロンプトを移動する。
[10]ファイル:[C:\temp\abc]の削除に失敗しました

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] 文字列pathnameにディレクトリのパスと名前を設定する。
  • [2] Fileクラスからpathnameをパス名に持つfileインスタンスを生成する。
  • [3] ディレクトリの内容を配列:filesとして取得する。
  • [4] 配列:filesの要素数が0以上かを調べる。
  • [5] 要素数が0以上であるなら、ディレクトリが空でないので削除できないことを表示する。
  • [6] プログラムを終了する。
  • [7] deleteメソッドにより、ファイルの削除を行う。
  • [8] ファイルの削除が成功したことを表示する。
  • [9] プログラムを終了する。
  • [10] ファイルの削除が失敗したことを表示する。

まとめ

このページではJavaでファイルやディレクトリを判別する方法についてお伝えした。

Fileクラスには色々なメソッドがあるが、isFileやisDirectoryも覚えておいていいメソッドだ。サンプルプログラムを動かして確認していただければと思う。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できます。

IT講師に興味はありませんか?

・「今までIT講師をやってきたが、更に多くの講義を行いたい」

・「エンジニアとしてやってきたが講師業に魅力を感じている」

・「講師として活躍するためにベースとなる知識を知りたい」

・「様々な分野や言語の講師にチャレンジしてみたい」


という方はぜひIT講師募集のページをご覧ください。


リスキルテクノロジーでは「受講している方々にITを好きになってもらう」ことを目標に、同じ目標に向かって歩んで行ける講師の方を常に探しています。


システム開発やインフラ構築などのエンジニアリング経験を活かし、新入社員などの未経験者や経験の浅い初学者の方々に対してITトレーニングを行っていただくことになります。


テキストやカリキュラムは事前に用意されており、それらを元に講義を進めていくため、IT講師をはじめて実施する方でも安心してトレーニングを実施できます。


IT講師募集のページを見る

SNSでもご購読できます。

コメントを残す

*

未経験からの育成制度も充実
IT講師に興味はありませんか?

リスキルテクノロジーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する