Javaでファイル操作をしてみる

Java_icon Java
この記事は約18分で読めます。

この記事は、以下の方を対象に書いています。

  • Javaでファイル操作をするためのメソッドを知りたい
  • ファイル操作をしているサンプルコードが知りたい

ファイル操作の基本

まずは、Javaでファイル操作をするための基礎から解説していきます。

Javaには、基本的なファイル操作をするための便利なクラスがあります。

Fileクラス

Fileクラスは、ファイルやディレクトリ(フォルダ)の操作をするためのクラスです。

ファイルやディレクトリの作成、削除、名前変更(リネーム)、プロパティの取得が可能です。

それぞれの機能のサンプルコードを書いてみます。

ファイルの作成

まずは、一番簡単な方法でファイルの作成をしてみます。

Fileオブジェクトを作成した後に、

FileオブジェクトのcreateNewFileメソッドを使って、ファイルを作成しています。

package java20240814;

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

public class Sample1 {

	public static void main(String[] args) {
		// Fileオブジェクトの作成
		File file = new File("Sample.txt");
		try {
			// ファイルの作成
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ただし、このサンプルコードだと、既にSample.txtが作成されていた場合、

何も起こらず、パッと見では新しく作成されたか、作成されていないのか分かりません。

そのため、if文を使ってファイルが作成されたか、されていないかで処理を分岐させてみます。

ポイントは、createNewFileメソッドの戻り値がboolean型であるところです。

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

public class Sample1 {

	public static void main(String[] args) {
		// Fileオブジェクトの作成
		File file = new File("Sample.txt");
		try {
			// ファイルの作成
			if (file.createNewFile()) {
				System.out.println("ファイルが作成されたよ");
			} else {
				System.out.println("何もしてないよ");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ファイルの削除

次は、ファイルの削除を行うサンプルコードを書いてみます。

ファイルの削除をするためには、Fileオブジェクトのdeleteメソッドを使用します。

deleteメソッドも戻り値はboolean型なので、if文の判定式に使えます。

import java.io.File;

public class Sample1 {

	public static void main(String[] args) {
		// Fileオブジェクトの作成
		File file = new File("Sample.txt");
		// ファイルの削除
		if (file.delete()) {
			System.out.println("ファイルが削除されたよ");
		} else {
			System.out.println("何もしてないよ");
		}
	}
}

ファイルの名前変更

次は、ファイルの名前変更をしてみます。

名前変更する際は、renameToメソッドを使用します。

renameToメソッドも戻り値はboolean型になるので、if文の判定式に使用できます。

また、後述しますが、ファイルの名前変更はFilesクラスで行うのが安全なので、

出来るだけFilesクラスで名前変更をするのが無難です。

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

public class Sample1 {

	public static void main(String[] args) {
		// Fileオブジェクトの作成
		File file = new File("Sample.txt");
		try {
			// ファイルの作成
			if (file.createNewFile()) {
				System.out.println("ファイルが作成されたよ");
			} else {
				System.out.println("何もしてないよ");
			}
			
			// 名前変更後のFileオブジェクトを作成
			File newFile = new File("New.txt");
			// 名前変更("Sample.txt" -> "New.txt")
			if (file.renameTo(newFile)) {
				System.out.println("名前変更完了");
			} else {
				System.out.println("何もしてないよ");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ファイルのプロパティ取得

次は、ファイルのプロパティを取得するサンプルコードを書いてみます。

また、プロパティとは、簡単に言うと対象の詳細な情報になります。

つまり、ファイルのサイズや更新日などの詳細情報を取得することができます。

import java.io.File;
import java.text.SimpleDateFormat;

public class Sample1 {
	public static void main(String[] args) {
		File file = new File("Sample.txt");
		
		System.out.println("ファイル名:" + file.getName()); // ファイル名:Sample.txt
		System.out.println("サイズ:" + file.length()); // サイズ:0
		System.out.println("ディレクトリかどうか:" + file.isDirectory()); // ディレクトリかどうか:false
		System.out.println("隠しファイルかどうか:" + file.isHidden()); // 隠しファイルかどうか:false
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println("更新日時: " + sdf.format(file.lastModified())); // 更新日時: 2024/08/15 00:53:54
	}
}

PathクラスとFilesクラス

Pathクラスは、パスを表現するためのクラスです。

このクラスは、言葉で説明するよりサンプルコードの挙動を見るのが理解が速いと思います。

また、PathクラスはFilesクラスを組み合わせて使用します。

Filesクラスは、Java7で導入されたクラスで、より高度なファイル操作が可能になります。

ただし、Fileクラスの方が軽量なので単純なファイル作成や削除はFileクラスで行うのが無難です。

ここでは、PathクラスとFilesクラスを使ったサンプルコードを紹介します。

パス情報の取得

まずは、Pathクラスを使って、パス情報を取得してみます。

パス情報を取得するためには、Paths.get(ファイル名)を使います。

その後、取得したパス情報を使ってファイル名や絶対パスなどの情報を見れるようになります。

Path path = Paths.get("Sample.txt");
System.out.println("ファイル名:" + path.getFileName());
System.out.println("親ディレクトリ:" + path.getParent());
System.out.println("絶対パス:" + path.toAbsolutePath());
System.out.println("ルートディレクトリ:" + path.getRoot());

また、Paths.getメソッドは、絶対パスでファイルを指定することも可能です。

Path path = Paths.get("/home/user1/sample/sample.txt");

// または

Path path = Paths.get("home", "user1", "sample", "sample.txt");

Pathオブジェクトの利点は、

WindowsやUNIX系のパス構造の違いを勝手に吸収してくれるので、

OSに依存しないところが利点になります。

ファイルの存在確認

ファイルの存在確認は、使用頻度が高いので覚えておきましょう。

パス情報を取得した後に、Filesクラスのexistsメソッドでファイルの存在確認ができます。

existsメソッドの引数に取得したパス情報を設定します。

existsメソッドも戻り値はboolean型になります。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Sample1 {
	public static void main(String[] args) {
		Path path = Paths.get("Sample.txt");
        // ファイルの存在確認
		if (Files.exists(path)) {
			System.out.println("Sample.txtは既にあります。");
		} else {
			System.out.println("Sample.txtはありません。新しく作成します。");
			try {
				if (Files.createFile(path) != null) {
					System.out.println("新しく作成しました。");
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

また、上記のサンプルコードで行っている通り、

PathクラスとFilesクラスを使って、ファイルの作成や削除を行うことも可能です。

ファイルの名前変更

前述しましたが、名前変更はFileクラスのrenameToメソッドでも行えますが、

Filesクラスのmoveメソッドを使う方が安全になります。

理由としては、renameToメソッドはプラットフォームに依存するため、

名前変更の処理が失敗してしまう可能性があります。

よって、名前変更はmoveメソッドを使用することをお勧めしています。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Sample1 {
	public static void main(String[] args) {
		// 現在のパス情報
		Path oldPath = Paths.get("Sample.txt");
		// 変更後のパス情報
		Path newPath = Paths.get("NewSample.txt");
		
		try {
			// 名前変更
			Files.move(oldPath, newPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ディレクトリの操作

ここまでは、ファイルの操作をメインに紹介しましたが、

ディレクトリの操作も可能ですので、最後にまとめて紹介します。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Sample1 {
	public static void main(String[] args) {
		// パス情報を取得
		Path dir = Paths.get("Sample");
		// 存在確認
		if (Files.exists(dir) && Files.isDirectory(dir)) {
			System.out.println("既にSampleというディレクトリは存在しますよ。");
		} else {
			try {
				// ディレクトリの作成
				Files.createDirectory(dir);
				System.out.println("ディレクトリを新規作成しましたよ");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

存在確認は対象がディレクトリかどうかも知りたいので、

FilesクラスのisDirectoryメソッドで判定しています。

また、ディレクトリを作成するには、FilesクラスのcreateDirectoryメソッドを使用します。

createDirectoryメソッドは、既に対象のディレクトリが存在している場合、

例外を返すので、その前に存在確認をしています。

ファイルの読み書き

Javaでファイル操作をするための、基礎は解説したので、

次は少し難易度を上げて、テキストファイルへ文字を書き込んだり、

読み込む方法について、サンプルコードを交えながら解説していきます。

ファイルの読み込み

まずは、読み込みの方法から紹介していきます。

読み込みをするためには、BufferedReaderクラスやFileReaderクラスを使用します。

今回は、以下のテキストファイルを読み込んでいきます。

start

aaa
bbbb
ccccc

end

次は、読み込み用のサンプルコードです。

以下の例では、Fileクラスを使ってみました。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Sample1 {
	public static void main(String[] args) {
		// ファイルオブジェクトを作成
		File file = new File("Sample.txt");
		
		// 対象ファイルの設定
		try (BufferedReader br = new BufferedReader(new FileReader(file))) {
			String line = null;
			// 1行ずつ読み込んでコンソール出力
			while((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

以下の例では、処理内容は同じですが、PathクラスとFilesクラスを使ってみました。

public class Sample1 {
	public static void main(String[] args) {
		// 読み込みたいファイルのパス
		Path path = Paths.get("Sample.txt");
		
		// 対象ファイルの設定
		try (BufferedReader br = Files.newBufferedReader(path)) {
			String line = null;
			// 1行ずつ読み込んでコンソール出力
			while((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ファイルの書き込み

次は、ファイルの書き込みをしてみます。

書き込みをするためには、考えておかないといけないことがあります。

それは、上書きをするのか、追記をするのかです。

上書き

上書きをするのであれば、シンプルに表現することができます。

書き込みをする際は、BufferedWriterクラスのwriteメソッドを使用します。

今回は「hello!」という文字をテキストファイルに表示していますが、

上書きになりますので、事前に書いていた文字は消えています。

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Sample1 {
	public static void main(String[] args) {
		// 読み込みたいファイルのパス
		Path path = Paths.get("Sample.txt");
		
		// 対象ファイルの設定
		try (BufferedWriter br = Files.newBufferedWriter(path)) {
			br.write("hello!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

追記

次は、事前に書かれている文字を消したくない場合の追記について紹介します。

重要なポイントがいくつかあるので、順番に解説します。

追記するためには、Files.newBufferedWriterメソッドの第2引数に

StandardOpenOption.APPEND」を設定します。

ただし、このオプションを設定した場合は、指定のファイルが存在していないと

例外になってしまうので、ファイルの存在確認をしています。

そして、ファイルが存在していなければ新しくファイルを作ってから、

書き込みをするようにしています。

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class Sample1 {
	public static void main(String[] args) {
		// 読み込みたいファイルのパス
		Path path = Paths.get("Sample.txt");
		
		if (!Files.exists(path)) {
			try {
				Files.createFile(path);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		write(path, "追記したよ");
	}
	
	private static void write(Path path, String content) {
		// 対象ファイルの設定
		try (BufferedWriter br = Files.newBufferedWriter(path, StandardOpenOption.APPEND)) {
			br.write(content);
			br.newLine();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

さいごに

ここまで読んでいただきありがとうございます。

今回はJavaでファイル操作をする方法について紹介しました。

サンプルコードを改造して、挙動を確かめながら覚えていってほしいと思います。

コメント

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