Java『Fileクラス』ファイル操作の機能まとめ

Java『Fileクラス』ファイル操作の機能まとめ Javaプログラミング入門

【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】

Fileクラスとは?

Fileクラスとは、パソコンで扱うファイルの操作を行う為のクラスです。

例えば、みなさんが仕事などでシステムを使う時、パソコンで作成したファイルをシステムに取り込んだり、
逆にシステムからファイルとしてダウンロードしたことがあると思います。

 テキストファイル

Javaにはそういった用途を踏まえて、ファイルをオブジェクトとして取り扱う為のFileクラスが用意されています。

Fileクラスの定義

Fileクラスは以下のように定義します。

File file = new File(ファイルパス + ファイル名);

新規にファイルを作る時も、既にあるファイルを取り込む時も同じように取り扱います。

まだ存在しない新規ファイルなのに、
既にあるファイルと同じように定義するということにちょっと違和感があると思いますが、

これは、定義することでファイルができるということではなく、
まだこの段階ではファイルの情報を保存する箱を準備した状態
ということでイメージすれば少しわかりやすくなるのではないでしょうか。

 気づいた人

ファイルのフォルダパスを指定する方法

Fileクラスを定義する際に、指定できるフォルダパスには、相対パスと絶対パスの二種類があります。

相対パスとは?

相対パスとは、ある特定のフォルダを起点に目的のファイルやフォルダとの相対的な位置関係を示したパスです。

Javaプログラムの場合、ワークスペースにあるプロジェクトフォルダをルート(起点)として
以下のように相対パスを示します。

.\ファイル名

ルートを「.」として、フォルダとフォルダの区切りには、
パソコンの環境にあわせた区切り文字(セパレータとも呼びます)を使います。
(Windowsは「\」、UNIXは「\」(半角のバックスラッシュ)を使います。)

例えば、exampleプロジェクト直下にある
「test_dir」フォルダの「test.txt」ファイルのパスは相対パスを使うと以下のようになります。

.\test_dir\test.txt

絶対パスとは?

絶対パスとは、パソコン上で示される完全なパスのことです。

Cドライブの下にあるワークスペースのファイルを絶対パスで示すと以下のようになります。

C:\ワークスペースまでのパス\workspace\example\ファイル名

絶対パスはパソコンのルートディレクトリを起点とするので、フルパスとも呼ばれます。

相対パスと絶対パスどちらを使うべき?

このように、二種類の指定方法がありますが、どちらを使うべきかという話になると思います。

どちらもメリットデメリットありますが、基本的には相対パスを使いましょう!

なぜなら、相対パスを使うことで、環境に依存しないプログラミングができるようになるからです。

例えば、あなたのパソコンと私のパソコンでは、ユーザー名も違いますし、ワークスペースへのパスも違います。

つまり、それぞれのパソコンにまったく同じファイルを置いても、絶対パスが異なってきます。

 悩んでいる人

そんな時、Javaで作った同じプログラムをあなたと私のパソコンで動かすとなった際に、
絶対パスで指定しているプログラムを個々のパソコンにあわせて書き換えたり、
もしくは、パソコンの設定をプログラムにあわせる必要が出てきます。

しかし、相対パスにしておくと、ワークスペース直下のフォルダ構成はどのパソコンに持って行っても変わらないので、
プログラムやパソコンの設定を変えることなくすぐに実行できます。

ということで、ここからはファイル操作の方法を一通りご紹介します!

ファイルの新規作成(createNewFile)

新規作成には、「createNewFile」メソッドを使います。

処理がうまく通っても、コンソールには何も出力されないので、自分で出力メッセージを書くようにしましょう。

package example;

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

public class Example {

	public static void main(String[] args) {

		try {

			// ファイルオブジェクト作成
			File file = new File("test.txt");
			// ファイル作成
			file.createNewFile();
			
			System.out.println("ファイル操作成功しました!");
		}
		catch (IOException e) {
			
			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}
	}
}

Fileオブジェクトを生成する時に、ファイル名だけ指定しているので、
ファイル作成が成功すると、以下のルートフォルダに「test.txt」ファイルが作成されます。

C:\ワークスペースまでのパス\workspace\example\

また、ファイルを作成する処理は、Javaの出力処理を使う為、
パソコンの状況などによって例外が発生する場合があります。

「createNewFile」メソッドでファイルを作成する際には、
try~catchで入出力の例外を受け取ることが必須になるのであわせて定義しておきましょう。

フォルダの新規作成(mkdirs)

ファイルだけでなく「mkdirs」メソッドを使えばフォルダも作成することができます。

File file = new File(フォルダパス);
file.mkdirs();

「mkdir」と「mkdirs」メソッドが存在しますが、「mkdirs」は二階層以上のフォルダをまとめて作ることも、
一階層のみ単独でフォルダを作る(「mkdir」の機能)こともできるので、

「mkdir」の機能もあわせて持ち合わせている「mkdirs」を使いましょう

「mkdir」で二階層分のフォルダをまとめて指定してもフォルダは作成されないので注意してください。

ファイルの削除(delete)

ファイルを削除する時は、「delete」メソッドを使います。

File file = new File(ファイルパス + ファイル名);
・・・

file.delete();

プログラムから削除したファイルはごみ箱には入らずパソコンから完全に削除されるので利用する際は注意しましょう。

ファイルの名前を取得する(getName)

ファイル名を取得する時は「getName」メソッドを使います。

File file = new File(ファイルパス + ファイル名);
・・・

String fileName = file.getName();

String型で取得できるので、アップロードやダウンロードするファイルの名前を画面上に表示する時などに使えます。

ファイルのパスを取得する(getPath)

ファイルのパスを取得する時は「getPath」メソッドを使います。

File file = new File(ファイルパス + ファイル名);
・・・

String filePath = file.getPath();

文字列でパスが取得できますが、
ファイル名も含めたパスが取得されるのでパスだけ欲しい時は加工して使うようにしましょう。

パスの区切り文字を取得する(getSeparator:FileSystems)

パスの区切り文字を取得する時はFileSystemsクラスの「getSeparator」メソッドを使います。

プログラムを実行するパソコンの設定から情報を取得します。

String separator = FileSystems.getDefault().getSeparator();

プログラムを実行する環境によって区切り文字は変わるので、
パスを指定する際は文字列として直書きするのではなく、このメソッドを使うようにしましょう。

ファイルのコピー(copy:Files)

ファイルをコピーする時は、Filesクラスの「copy」メソッドを使います。

Filesクラスを使うにはjava.nio.file.Files」をインポートします。

package example;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class Example {

	public static void main(String[] args) {

		try {

			// コピー元ファイル
			File file = new File("test.txt");
			file.createNewFile();

			// コピーファイル
			File copyFile = new File("copy.txt");
			// コピー
			Files.copy(file.toPath(), copyFile.toPath());

			System.out.println("ファイル操作成功しました!");
		}
		catch (IOException e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}
	}
}

コピーする際は、コピー後のファイル情報をコピー処理の前に準備する必要があります。

また、コピー先のフォルダがない場合はコピーされないので、
実行の際はコピー先のフォルダが存在しているか確認しましょう。

後で紹介する「exists」メソッドを使うことでフォルダが存在する時のみ作成するような処理にすることもできるので、
余裕がある人はチャレンジしてみましょう!

ファイルの移動(move:Files)

ファイルを移動する時は、Filesクラスの「move」メソッドを使います。

package example;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;

public class Example {

	public static void main(String[] args) {

		try {

			// 移動元ファイル
			File file = new File("test.txt");
			file.createNewFile();

			// フォルダの区切り文字
			String separator = FileSystems.getDefault().getSeparator();

			// 移動先フォルダ作成
			File dir = new File("." + separator + "move");
			dir.mkdirs();

			// 移動先の指定
			File moveFile = new File("." + separator + dir.getName() + separator + file.getName());

			// 移動
			Files.move(file.toPath(), moveFile.toPath());

			System.out.println("ファイル操作成功しました!");

		} catch (IOException e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}
	}
}

ファイルの置き場所やフォルダ構成を後で変える可能性も考えて、
移動先の指定は、文字列で直接指定するのではなく、移動元のファイル情報を参照して使うようにしましょう!

こうすることでプログラムのメンテナンス性が上がります!

ファイル名の変更(renameTo)

ファイル名を変更する時は「renameTo」メソッドを使います。

名前が変更されたことが確認できるように、元ファイル「test.txt」は事前に作成して中身を編集しておきましょう

package example;

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

public class Example {

	public static void main(String[] args) {

		try {

			// 元ファイル
			File file = new File("test.txt");

			// 名前変更ファイル
			File renameFile = new File("rename.txt");

			// 名前変更
			file.renameTo(renameFile);

			System.out.println("ファイル操作成功しました!");

		} catch (IOException e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}
	}
}

名前を変えるだけなので、元ファイルの情報だけで良さそうなイメージですが、
名前を変更した後のファイル情報を元ファイルの情報とは別に準備しておく必要があるので覚えておいてください。

ファイルがあるかどうか確認する(exists)

ファイルの存在チェックをする時は「exists」メソッドを使います。

File file = new File(ファイルパス + ファイル名);
・・・

boolean isExists = file.exists();

ファイルだけでなく、パスだけ指定すればフォルダの存在チェックもできます

このメソッドを使えば、ファイルを新規作成する時など、
既に同じ名前のファイルがないか確認してから作成することができます。

ファイルの読み込み

テキストファイルを1行ずつ読み込む方法をご紹介します。

プロジェクトフォルダの下に、「test_dir」フォルダを作成して、
そこに「test.txt」ファイルを以下の内容で作成して読み込ませてみましょう。

1行目です。
2行目です。
3行目です。

ファイルの読み込みには、Fileクラスの他に、FileReaderクラスとBufferedReaderクラスを使います

package example;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.nio.file.FileSystems;

public class Example {

	public static void main(String[] args) {

		try {

			String separator = FileSystems.getDefault().getSeparator();

			File file = new File("." + separator + "test_dir" + separator + "test.txt");

			BufferedReader br = new BufferedReader(new FileReader(file));

			String str;
			while ((str = br.readLine()) != null) {

				System.out.println(str);
			}

			br.close();

			System.out.println("ファイル操作成功しました!");

		} catch (Exception e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}

	}
}

FileReaderクラスだけでもファイルは読み込めるのですが、1文字ずつの読み込み機能しか持っていないので、

1行ずつの読み込み機能を持っているBufferedReaderクラス
さらにラッピング(追加機能を持ったクラスを上からかぶせて使うこと)しています。

また、読み込み処理には、while文を使って、
「readLine」メソッドから読み込まれる内容がnull(空)になった時点で読み込み処理を終了するようにしています。

そして、FileReaderやBufferedReaderクラスは、プログラム上からファイルへのアクセス処理を行う為、
使った後に「close」処理でファイルを必ず閉じる必要があります

最上位のBufferedReaderクラスのオブジェクトをcloseすれば、
ラッピングされているFileReaderクラスもcloseしたことになるので
この例ではBufferedReaderのみcloseすれば大丈夫です。

ファイルへ書き込み

次に、テキストファイルに文字を書き込む方法をご紹介します。

先ほどの読み込みサンプルで使った「test.txt」ファイルに1行書き足してみましょう。

ファイルの書き込みには、Fileクラスの他に、FileWriterクラスとBufferedWriterクラスを使います

package example;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.nio.file.FileSystems;

public class Example {

	public static void main(String[] args) {

		try {

			String separator = FileSystems.getDefault().getSeparator();

			File file = new File("." + separator + "test_dir" + separator + "test.txt");

			BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));

			bw.newLine();
			bw.append("最終行です。");
			bw.newLine();

			bw.close();

			System.out.println("ファイル操作成功しました!");

		} catch (Exception e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}

	}
}

書き込んだ後のファイルを開くと以下のようになります。

1行目です。
2行目です。
3行目です。
最終行です。

「append」メソッドで文字をファイルに書き込みます。
また、「newLine」メソッドを使って改行します。

改行しないと同じ行の後ろへ文字がどんどん追加されてしまうので、セットで使うようにしましょう。

また、ファイルへ追記する時は、必ずFileWriterクラスの第二引数に「true」を指定してください。

「true」の指定がないと、新規に上書きして書き込む処理となって、
ファイルの中身を一旦クリアして文字を書き込んでしまうので注意しましょう。

そして、FileWriterやBufferedWriterクラスも、プログラム上からファイルへのアクセス処理を行う為、
使った後に「close」処理でファイルを必ず閉じる必要があります

文字コードと文字化け

パソコンで表示する文字には、文字コードというものが存在し、
パソコンが文字を区別できるよう、「あ」や「a」といった1文字1文字に内部的に番号が振られています

文字コードも複数の種類があり、同じ「あ」の文字でも、
異なる文字コードであれば内部的に振られている番号が異なります。

つまり、文字を書いた時に使った文字コードと違う文字コードでファイルを読み取った場合、
意味のわからない文字の羅列が表示されることになります。

こんな状態を「文字化け」と言います。

 文字化け

文字コードには、「UTF-8」「Shift-JIS」などいろいろな種類があって、
国や言語、パソコンの種類によっても変わってきます。

ファイルを開いて文字化けした時は
文字コードを正しく認識できていない可能性が高いので、設定など見直してみましょう。

ファイルの文字コードを指定して読み込み

ファイルの読み込みで文字化けが起こった時、
正しい文字コードを指定して読み取る方法についてこれから説明します。

読み取る時に使うクラスに文字コードを設定するのですが、
先ほどご紹介したFileReaderクラスにはその機能がありません

なので、代わりにInputStreamReaderクラスを使うことで
文字コードを指定してファイルを読み取ることができるようになります。

package example;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.file.FileSystems;

public class Example {

	public static void main(String[] args) {

		try {

			String separator = FileSystems.getDefault().getSeparator();

			File file = new File("." + separator + "test_dir" + separator + "test.txt");
			InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
			BufferedReader br = new BufferedReader(isr);

			String str;
			while ((str = br.readLine()) != null) {

				System.out.println(str);
			}

			br.close();

			System.out.println("ファイル操作成功しました!");

		} catch (Exception e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}

	}
}

文字コードを指定する必要がある時はこちらの読み取り方法を使いましょう。

ファイルの文字コードを指定して書き込み

次に、文字コードを指定して書き込みをする方法です。

既にあるファイルに追記する時は、元々の文字コードにあわせて書き込みをしないといけません。

また、プログラムを実行するパソコンの環境にあわせて文字コードを指定する必要がある場合も出てきます。

書き込みの時に使っていたFileWriterクラスでは文字コードを指定できないので、
代わりにOutputStreamWriterクラスを使います

package example;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.file.FileSystems;

public class Example {

	public static void main(String[] args) {

		try {

			String separator = FileSystems.getDefault().getSeparator();

			File file = new File("." + separator + "test_dir" + separator + "test.txt");
			OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file, true), "UTF-8");
			BufferedWriter bw = new BufferedWriter(osw);

			bw.newLine();
			bw.append("最終行です。");
			bw.newLine();

			bw.close();

			System.out.println("ファイル操作成功しました!");

		} catch (Exception e) {

			e.printStackTrace();
			System.out.println("ファイル操作失敗しました。。");
		}

	}
}

ファイルが出力されたら、テキストエディタで開き、
試しに文字コードを変えるなどして正しく書き込めているか確認してみましょう!

Fileクラス まとめ

Javaのファイル操作について以下説明しました。

  • ・Fileクラスについて
  • ・Fileクラスの宣言方法
  • ・相対パスと絶対パス
  • ・ファイルの新規作成(createNewFile)
  • ・フォルダの新規作成(mkdirs)
  • ・ファイルの削除(delete)
  • ・ファイル名取得(getName)
  • ・ファイルパス取得(getPath)
  • ・ファイルパスの区切り文字取得(getSeparator)
  • ・ファイルのコピー(copy)
  • ・ファイルの移動(move)
  • ・ファイル名の変更(renameTo)
  • ・ファイルの存在チェック(exists)
  • ・ファイルの読み込みと書き込み
  • ・文字コードと文字化け

ファイル操作をマスターすれば、ユーザーの指定するデータをデータベースに登録したり、
逆にデータベースに入っている情報をユーザーに渡すような処理を書けるようになります。

システム開発には必須の機能になるのでぜひマスターしておきましょう!

タイトルとURLをコピーしました