Developer

【はじめてのJava】Fileクラスのメソッド【入出力処理編】
2022.10.31
Lv1

【はじめてのJava】Fileクラスのメソッド【入出力処理編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


入出力処理編

入出力処理編では、Javaプログラムを外部ファイル等と連携する「入出力処理」について扱っていきます。

今回の記事は、前回記事で使用したjava.ioパッケージのFileクラスの主なメソッドについて解説していきます。なお、この内容はJava Silverよりも少し高度な内容です


目次


Fileクラスのメソッド

Fileクラスはjava.ioパッケージで提供されているクラスであり、プログラム中でファイルシステムを操作するために使用されるクラスということを前回記事で学習しました。
今回の記事では、このFileクラスの主なメソッドについて学習し、前々回の記事で解説を省略したソースコードについて解説していきます。
以下にFileクラスの主なメソッドについて紹介します。

Fileクラスのメソッド 説明
boolean createNewFile() Fileオブジェクトに対応する抽象パス名がまだ存在していない場合、このパス名を使って新しいファイルを作成し、trueを返す。ファイルが存在する場合はfalseを返す
boolean delete() Fileオブジェクトの表すファイルまたはディレクトリ、つまり、このオブジェクトに対応した抽象パス名が示すファイルまたはディレクトリを削除する。削除が成功すればtrueを返す。
boolean exists() Fileオブジェクトに対応するパスを示すファイルまたはディレクトリが存在する場合にtrueを返す
String getAbsolutePath() Fileオブジェクトの表すファイルまたはディレクトリの絶対パスを返す
String getCanonicalPath() パス名においてシステム依存のセパレータを使って、絶対パスを返す
String getName() Fileオブジェクトの表すファイルまたはディレクトリの名前を返す
String getParent() Fileオブジェクトの表すファイルまたはディレクトリの親の名前を返す
boolean isAbsolute() Fileオブジェクトに対応するパス名が絶対パス名の場合にtrueを返す
boolean isDirectory() Fileオブジェクトがディレクトリを表す場合にtrueを返す
boolean isFile() Fileオブジェクトが通常のファイルを表す場合にtrueを返す
String[] list() Fileオブジェクトの表すディレクトリ内に含まれるファイルおよびディレクトリを格納したStringオブジェクトの配列を返す。この抽象パス名がディレクトリを示さない場合は、nullを返す
File[] listFiles() Fileオブジェクトの表すディレクトリ内のファイルを示すFileオブジェクトの配列を返す。この抽象パス名がディレクトリを示さない場合は、nullを返す。ディレクトリを示す場合はFileオブジェクトの配列を返す。
boolean mkdir() このFileオブジェクトに対応する抽象パス名を使用してディレクトリを作成する
boolean mkdirs() このFileオブジェクトに対応する抽象パス名を使用してディレクトリを作成するとともに、抽象パス名に存在していない親ディレクトリがあればその作成も行う。
boolean renameTo(File newName) このFileオブジェクトに対応する抽象パス名を使用してファイルの名前をnewNameで指定された新しい名前に変更する

表を見て分かる通り、指定されたファイルに対して様々な操作を行うことが出来ます。
また、Fileクラスのメソッドは指定されたパスにディレクトリやファイルが存在しない場合、基本的に例外にはならずにfalseやnullが返ってくる仕組みになっています。


サンプルコード

それでは、以前の記事で紹介したサンプルコードについて見ていきましょう。
下記のサンプルコードは、指定したディレクトリ内を探索し、ディレクトリに含まれる全てのファイル・ディレクトリの名前を出力するプログラムとなっています。
探索するのは指定したディレクトリ直下のみではなく、ツリー構造の末端まで探索する仕組みになっています。

import java.io.File;

public class Sample {
	public static void main(String[] args) {

		// サンプルではカレントディレクトリを指定
		// この変数に探索したいディレクトリの絶対パスを代入する
		String root = ".";

		File rootDir = new File(root);
		System.out.println("探索開始するディレクトリ:" + rootDir.getAbsolutePath());

		Sample obj = new Sample();
		obj.navigate(rootDir);
	}

	public void navigate(File dir) {
		System.out.println("");
		System.out.println("探索中のディレクトリ:" + dir);

		// 指定したディレクトリに含まれるファイル・ディレクトリの名前を配列で取得
		String[] contents = dir.list();
		for(int i = 0;i < contents.length; i++) {
			System.out.println(contents[i]);
			File child = new File(dir,contents[i]);

			// 取得した要素がディレクトリだった場合、そのディレクトリ内をさらに探索
			if(child.isDirectory()) {
				navigate(child);
			}
		}
	}
}

以下は筆者の環境で実行した際の実行結果の一部です。

それでは、サンプルコードの解説をしていきましょう。
今回探索するディレクトリは7・9行目で指定しています。7行目で定義した文字列を9行目でFileクラスのコンストラクタに渡すことでパスを指定しています。今回はカレントディレクトリを示す「.」をFileクラスのコンストラクタに渡しています。

パスを指定したあと、指定したFileクラスのオブジェクト(今回はカレントディレクトリ)を今回独自に定義したnavigateメソッドの引数に渡して実行しています。navigateメソッドを実行することで、指定したディレクトリ以下のファイル・ディレクトリ名を全て出力することが出来ます。
出力されているファイル名とエクスプローラを見比べるなどして実際にディレクトリ内を探索できているか確認してみてください。

navigateメソッドの処理は以下の通りです。
①引数に受け取ったファイル・ディレクトリの名前を出力する(18行目)

②引数に受け取ったディレクトリに含まれてるファイル・ディレクトリの名前の配列をlistメソッドを使用して取得(20行目)

③20行目で取得した配列について繰り返し処理を実行

※ここから④~⑥の処理を配列の要素一つずつに対して繰り返し
④要素の名前を出力

⑤親のディレクトリのパスと要素名を結合してFileクラスのオブジェクトをインスタンス化(24行目)

⑥24行目で取得したFileクラスのオブジェクトがディレクトリだった場合、そのオブジェクトをnavigateメソッドの引数に渡して再度実行(再起処理:①~⑥の処理を再度実行)。ファイルだった場合は次の繰り返し処理へ(ひとつ前のnavigateメソッドの処理の続きへ戻る。ない場合はプログラム終了)。

今回のサンプルコードのポイントは再起処理をしている点です。
navigateメソッドに渡されたディレクトリ内にディレクトリが含まれる場合、そのディレクトリに対してnavigateメソッドを実行します。この再起処理はnavigateメソッドに渡されたディレクトリにディレクトリが含まれなくなるまで(ツリー構造の末端にたどり着くまで)続きます。
探索の流れは以下の図のような流れで進んでいきます。下記の図のような場合、出力されるファイル・ディレクトリの名前の順番はアルファベット順に出力されていきます。

今回の記事で、今後は作成したJavaプログラムのみでなく、外部ファイルと情報をやり取りして処理を進めていくことが出来るようになりました。
Fileクラスのみでなく入出力に関するクラスは他にも多数存在します。
今回はファイルの存在確認やファイル名の取得をメインに取り扱いましたが、以降の記事ではファイルの読み込みや書き込み処理についても解説する予定です。


はじめてのJavaシリーズの目次はこちら