検索

キーワード


【Java】java.io.Fileクラスを使えばファイル・ディレクトリ操作ができる!?

  • 公開日:2020-10-16 17:33:11
  • 最終更新日:2021-01-25 17:58:20
【Java】java.io.Fileクラスを使えばファイル・ディレクトリ操作ができる!?

こんにちは。駆け出しプログラマーの松倉です!

ここでは、java.io.Fileクラスの使い方の紹介・解説を行います。

プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 

関連記事リンク:【Java】java.io.Fileクラスを使ってファイルの一覧の取得とフィルタリングをしてみよう!【Java】例外クラスの概要や使用実例を解説【Java】例外クラスの制御方法 3種類の基本と使い方を解説


java.io.File

java.ioパッケージ」には、データストリーム、直列化、ファイルシステムによるシステム入出力用などの様々なクラスが含まれます。

java.ioパッケージの一つである「java.io.File」は、Javaでファイルやディレクトリ(フォルダ)の作成、削除、存在確認など、プログラム上で必要な操作を行うことができます。

ファイル操作はこの Fileを通して行いますので、全ては Fileのインスタンスを生成したり取得するところから始まります。


この記事では java.io.Fileの以下のことについて紹介・解説を行います。

  • ファイル操作、ディレクトリ操作(新規作成、名称変更、削除)
  • パス、ファイル名、ファイル拡張子の取得


ファイル操作、ディレクトリ操作(新規作成、名称変更、削除)

Javaではファイルもディレクトリも同じものとして扱います。

つまりディレクトリも 1つの Fileクラスのオブジェクトとして扱うことが出来ます。

ファイルとディレクトリの操作の違いについて以下の表にまとめました

ファイル操作とディレクトリ操作の違い

ファイル操作とディレクトリ操作は基本的に同じ方法で実行することができますが、方法が異なるものもあります。

ここではファイルとディレクトリの新規作成、名称変更、削除の操作方法について紹介します。



新規作成

Javaでは新規に空のファイル、ディレクトリを作成することができます。

ファイル操作とディレクトリ操作では新規作成で扱うメソッドが異なります。


ファイル操作

新規に空のファイルを作成するには、Fileクラスの「createNewFileメソッド」を使用します

createNewFileメソッドは Fileオブジェクトが参照するパスに空のファイルを新規で作成します。

作成できたかどうかは戻り値の booleanで判断します。

指定のファイルが存在していない場合にのみ空のファイルを作成し、trueを返します。

存在している場合は作成せず、falseを返します。


createNewFileメソッドの使い方

File 変数名 = new File(新規で作成するファイル);
boolean 結果 = 変数名.createNewFile();

createNewFileメソッドを使う場合、「IOException」という例外が発生する可能性があります。

そのため、必ず例外処理を記述しましょう。


createNewFileメソッドを使ってファイルを新規作成するサンプルコードを確認しましょう。

import java.io.File;
import java.io.IOException;

public class Sample1_1 {
	public static void main(String[] args) {
		File newfile = new File("d:\\Sample\\test00.txt");

		try {
			if (newfile.createNewFile()) {
				System.out.println("ファイルの作成に成功しました");
			} else {
				System.out.println("ファイルの作成に失敗しました");
			}
		} catch (IOException e) {
			System.out.println(e);
		}
	}
}


実行結果:

ファイルの作成に成功しました

作成する時点では「d:\\Sample\\test00.txt」が存在しないためファイルの作成ができました。

ではこのプログラムをもう一度実行してみましょう。

 

実行結果:

ファイルの作成に失敗しました

「d:\\Sample\\test00.txt」が既に存在するため、ファイルの作成ができませんでした。


ディレクトリ操作

新規でディレクトリを作成する場合、「mkdirメソッド」を使うことで作成することができます。

mkdirメソッドは生成した Fileオブジェクトが参照するディレクトリを新規に作成します。

mkdirメソッドは親ディレクトリが存在していない場合、または既に指定のディレクトリが存在していた場合、このメソッドは falseを返してディレクトリを作成しません。

作成できたかどうかは戻り値の booleanで判断します。


mkdirメソッドの使い方

File 変数名 = new File(ディレクトリ名);
boolean 結果 = 変数名.mkdir();

親ディレクトリを含めて必要なディレクトリ階層を全て作成する場合は、「mkdirsメソッド」を使用します。

mkdirメソッドでは親ディレクトリがまだ存在しないディレクトリを作成する場合、ディレクトリを作成することはできません。


そのため親ディレクトリから1つ1つ作成しなければなりません。

しかし、mkdirsメソッドは親ディレクトリが存在しない場合、必要なディレクトリを全て作成します


mkdirsメソッドの使い方

File 変数名 = new File(ディレクトリ名);
boolean 結果 = 変数名.mkdirs();


新規でディレクトリを作成するサンプルコードを確認しましょう。

import java.io.File;

public class Sample1_2 {
	public static void main(String[] args) {
		File newfile = new File("d:\\Sample\\sub");

		if (newfile.mkdir()) {
			System.out.println("ディレクトリの作成に成功しました");
		} else {
			System.out.println("ディレクトリの作成に失敗しました");
		}
	}
}


実行結果:

ディレクトリの作成に成功しました

作成時点でディレクトリ「d:\\Sample(親ディレクトリ)」が存在し、「sub」が存在しないため、ディレクトリの作成に成功しています。

ではこのプログラムをもう一度実行してみましょう。


実行結果:

ディレクトリの作成に失敗しました

 ディレクトリ「d:\\Sample\\sub」が存在しているため、ディレクトリの作成ができませんでした。


存在確認

ファイルを操作する前に操作対象のファイルが存在するかを確認します。

指定のファイルまたはディレクトリが存在するかどうかを確認するには、Fileクラスの「existsメソッド」を使用します。

existsメソッドは生成した Fileオブジェクトが参照するファイルもしくはディレクトリが存在するかを調べます。

存在確認ができたかどうかは戻り値の booleanで判断します。

存在する場合は trueを、存在しない場合は falseを返します。

対象のディレクトリにアクセス権限がない場合は、ファイルが存在していても falseを返します。


existsメソッドの使い方

File 変数名 = new File(確認するファイル名);
boolean 結果 = 変数名.exists();


新規作成したファイル「d:\\Sample\\test00.txt」を existsメソッドで調べるサンプルコードを確認しましょう。

import java.io.File;

public class Sample2 {
	public static void main(String[] args) {
		File file = new File("d:\\Sample\\test00.txt");

		if (file.exists()) {
			System.out.println("ファイルは存在します");
		} else {
			System.out.println("ファイルは存在しません");
		}
	}
}


実行結果:

ファイルは存在します

「d:\\Sample\\test00.txt」が存在することが確認できました。


名称変更(リネーム)

ファイルまたはディレクトリをリネームまたは移動するには、Fileクラスの「renameToメソッド」を使用します。

renameToメソッドは生成した Fileオブジェクトが参照するファイル(またはディレクトリ)を、引数で指定した Fileオブジェクトが参照するファイル(ディレクトリ)へリネームします。

同名のファイル名でパスを変更した場合は移動となります。

移動できたかどうかは戻り値の booleanで判断します。


renameToメソッドの使い方

File 変数名1 = new File(移動前のファイル名);
File 変数名2 = new File(移動後のファイル名);
boolean 結果 = 変数名1.renameTo(変数名2);


ファイル操作の新規作成で新たに作成したファイル「d:\\Sample\\test00.txt」を renameToメソッドを使って移動させたサンプルコードを確認しましょう。

import java.io.File;

class Sample3 {
	public static void main(String[] args) {
		File newfile = new File("d:\\Sample\\test00.txt");
		File renamefile = new File("d:\\Sample\\test01.txt");

		if (newfile.exists()) {
			if (newfile.renameTo(renamefile)) {
				System.out.println("ファイルの移動に成功しました");
			} else {
				System.out.println("ファイルの移動に失敗しました");
			}
		} else {
			System.out.println("ファイルが存在しません");
		}
	}
}


実行結果:

ファイルの移動に成功しました

「d:\\Sample\\test00.txt」が「d:\\Sample\\test01.txt」に移動したことが確認出来ました。


削除

指定のファイルまたはディレクトリを削除するには、Fileクラスの「deleteメソッド」を使用します。

deleteメソッドは生成した Fileオブジェクトが参照するファイル(またはディレクトリ)を削除します。

削除できたかどうかは戻り値の booleanで判断します。

※ディレクトリを削除する場合は、あらかじめ対象のディレクトリを空にしておく必要があります。

そのため対象ディレクトリが空ではない場合は削除に失敗します。


deleteメソッドの使い方

File 変数名 = new File(削除するファイル名);
boolean 結果 = 変数名.delete();


ファイル操作のリネームで移動したファイル「d:\\Sample\\test01.txt」を deleteメソッドで削除するサンプルコードを確認しましょう。

import java.io.File;

public class Sample4 {
	public static void main(String[] args) {
		File file = new File("d:\\Sample\\test01.txt");

		if (file.exists()) {
			if (file.delete()) {
				System.out.println("ファイルを削除しました");
			} else {
				System.out.println("ファイルの削除に失敗しました");
			}
		} else {
			System.out.println("ファイルが存在しません");
		}
	}
}


実行結果:

ファイルを削除しました

「d:\\Sample\\test01.txt」の削除に成功したことが確認出来ました。


パス、ファイル名、ファイル拡張子の取得

Javaでファイル操作をする上で、ファイルパスを指定したりパスを取得するといった操作が必要になることがあります。

パスとは目的のファイルがどこのフォルダに保存されているのかを示すものです。

ウェブサイトのアドレスもこのパスの一種です。

パスには「絶対パス」と「相対パス」の 2種類があります。

絶対パスとはルートディレクトリと呼ばれる階層構造の頂点から目的地までの経路を表しています。

そのためユーザが現在どのフォルダで作業中であっても、常に同じスタート地点から一つ経路の表示となります。

相対パスとは基準となる現在のファイルから見て、任意のファイルがどこにあるかを指定します。

そのため現在作業中のフォルダによってこの経路は異なります。


ファイルのパスを取得

ファイルのパスを取得する場合は、Systemクラスの「getAbsolutePathメソッド」を使用します。

getAbsolutePathメソッドは絶対パスによるファイルの位置と名前を取得できます。


getAbsolutePathメソッドの使い方

File 変数名 = new File(相対パスで指定したファイル名);
String 絶対パス = 変数名.getAbsolutePath();

Fileクラスを使い相対パスで指定したファイルから、絶対パスを取得したいファイルのオブジェクトを作成します。

作成したオブジェクトから getAbsolutePathメソッドを呼び出すことでファイルの絶対パスを取得できます。


getAbsolutePathメソッドを使った絶対パスによるファイルの位置と名前を取得したサンプルコードを確認しましょう。

import java.io.File;

class Sample5 {
	public static void main(String[] args) {
		File file = new File("test01");
		String str = file.getAbsolutePath();
		System.out.println("pass : " + str);
	}
}


実行結果:

pass : D:\PleadesDownload\pleiades\workspace\sample\test01

絶対パスを取得することが出来ました。


ファイル名

ファイル名やディレクトリは一覧を文字列としてではなく Fileクラスのオブジェクトの配列として取得しています。

getNameメソッド」はファイルパスからファイル名を、 「getParentメソッド」ファイルパスからディレクトリ名を取得することができます。


getNameメソッドの使い方

File 変数名 = new File(ファイル名を取得したいファイルパス);
String 名前 = 変数名.getName();


getParentメソッドの使い方

File 変数名 = new File(ディレクトリ名を取得したいファイルパス);
String パス名 = 変数名.getParent();

※ getParent() は文字列で取得しますが getParentFile() は結果を File クラスで取得できます。


ファイル名を取得するサンプルコードを確認しましょう。

import java.io.File;

public class Sample6 {
	public static void main(String[] args) {
		File fileName = new File("d:\\PleadesDownload\\pleiades\\workspace\\sample\\test01");
		String file = fileName.getName();
		System.out.println("ファイル名 : " + file);

		File dirName = new File("d:\\PleadesDownload\\pleiades\\workspace\\sample\\test01");
		String dir = dirName.getParent();
		System.out.println("ディレクトリ名 : " + dir);
	}
}


実行結果:

ファイル名 : test01
ディレクトリ名 : \PleadesDownload\pleiades\workspace\sample


ファイル拡張子

拡張子はファイルの種類を示すのに使われます。

プログラムでファイルの入出力を伴う処理を実装する際、ファイルの拡張子を取得することが多々あります。

lastIndexOfメソッド」は指定された文字を文字列の後ろから検索して、最初に見つかった位置を取得することができます。

拡張子はファイル名の最後の( . )ピリオド以降の文字で表現されます。

「d:\\Sample\\test01.txt」であれば「.txt」が拡張子に当たります。

lastIndexOfメソッドを使って、ファイル名の後ろから( . )ピリオドを検索する事でファイルの拡張子を取得することができます。


lastIndexOfメソッドを使って措定したファイルから拡張子を取得するサンプルコードを確認しましょう。

import java.io.File;

public class Sample7 {
	public static void main(String[] args) {
		File file = new File("d:\\Sample\\test01.txt");

		String fileName = file.getName();
		String ext = fileName.substring(fileName.lastIndexOf(".") + 1);

		System.out.println("ファイル名 : " + fileName);
		System.out.println("拡張子 : " + ext);
	}
}


実行結果:

ファイル名 : test01.txt
拡張子 : txt

拡張子を判別して取得できていることが確認できました。


まとめ

この記事では java.io.Fileクラスの使い方について解説しました。

Fileクラスは、ファイルやディレクトリを作成したり、ファイルのチェック処理、読み込み・書き込み処理といった、ファイルシステムの操作全般で使用します。

Javaの開発では何かしらのファイルを扱う機会は多いため、この記事でファイル操作の基本を覚えましょう。

ファイル・ディレクトリ操作で気を付ける点として、自分が行っている操作が何に対して行っているかをしっかりと理解していなければなりません。

ディレクトリに対して操作を行いたいのに、ファイルに対して操作を行っていたり、またその逆もあります。

Fileクラスにはこの記事で紹介したメソッドの他にも多くのメソッドが用意されています。

例えば、親ディレクトリパスの取得、ファイルの一覧の取得、ファイル名の取得などがあります。

この記事では紹介しきれなかったことを【Java】java.io.Fileクラスを使ってファイルの一覧の取得とフィルタリングをしてみよう!で記述しています。

興味のある方はこちらの記事も読んでみてください。


関連記事リンク:【Java】java.io.Fileクラスを使ってファイルの一覧の取得とフィルタリングをしてみよう!【Java】例外クラスの概要や使用実例を解説【Java】例外クラスの制御方法 3種類の基本と使い方を解説

【著者】

松倉祥大

はじめまして。フォワードソフト株式会社の松倉です。
システムエンジニアとして働き始めたのが2020年4月です。経験や知識がない状態で入社した私は、フォワードソフトの教育研修で一からプログラミングの勉強をしました。教育研修を卒業後、Javaのプログラミングについて初学者向けの記事を共同で制作しています。
知識や経験はまだまだですが、これからいろんな職場で様々な経験しながら勉強していきたいと思っています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様