検索

キーワード


目次

【Java】java.io.Fileクラスを使ってファイルの一覧の取得とフィルタリングをしてみよう!

  • 公開日:2020-10-21 10:24:42
  • 最終更新日:2021-01-25 17:54:59
【Java】java.io.Fileクラスを使ってファイルの一覧の取得とフィルタリングをしてみよう!

Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!

フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。



こんにちは。

駆け出しプログラマーの松倉です!

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

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

関連記事リンク:【Java】java.io.Fileクラスを使えばファイル・ディレクトリ操作ができる!?【Java】if文?switch文? 条件分岐の追加方法など使い方を解説!【Java】while文や for文などの反復処理(繰り返し構文)と breakや continueなどの反復制御の使い方!



java.io.File

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

java.ioパッケージの一つである「java.io.File」は、Javaでファイルやディレクトリ(フォルダ)の一覧取得、フィルタリングなどの操作を行うことができます。

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


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

  • ファイル一覧取得
  • フィルタ(FileFileter, FilenameFilter)




ファイル一覧取得

Fileクラスの「listFilesメソッド」は、指定したディレクトリに含まれるファイルやディレクトリを配列として返します

主に指定したディレクトリの中身を調べたいときに使用します。

listFilesメソッドは、指定したパス名がディレクトリを示さない場合や、入出力エラーが発生した場合は nullを返します。


listFilesメソッドの使い方

File 変数名 = new File(調べたいディレクトリのパス);
File[] 一覧 = 変数名.listFiles();

listFilesメソッドで一覧を取得するとファイルとディレクトリの判別ができません。

そのためファイルとディレクトリを判別するには、Fileクラスの「isFileメソッド」と「isDirectoryメソッド」を使用します。

isFileメソッドは対象がファイル、isDirectoryメソッドは対象がディレクトリだった場合 trueを返します。


isFileメソッドの使い方

File 変数名 = new File(調べたいオブジェクト);
boolean 判断結果 = 変数名.isFile();


isDirectoryメソッドの使い方

File 変数名 = new File(調べたいオブジェクト);
boolean 判断結果 = 変数名.isDirectory();


listFilesメソッドでディレクトリの中身の一覧を取得し、取得したオブジェクトを「isFileメソッド」と「isDirectoryメソッド」で判別したサンプルコードを確認しましょう。

import java.io.File;

class Sample1 {
	public static void main(String[] args) {
		File file = new File("D:\\Sample");

		File[] list = file.listFiles();
		if (list != null) {
			for (int i = 0; i < list.length; i++) {
				if (list[i].isFile()) {
					System.out.println("[F] : " + list[i].toString());
				} else if (list[i].isDirectory()) {
					System.out.println("[D] : " + list[i].toString());
				}
			}
		} else {
			System.out.println("null");
		}
	}
}


実行結果:

[F] : D:\Sample\abc.txt
[D] : D:\Sample\sub
[F] : D:\Sample\target.txt
[F] : D:\Sample\test00.txt
[F] : D:\Sample\test01.txt
[F] : D:\Sample\test02.txt

ディレクトリの中身の一覧を取得することができました。

取得したものがファイルの場合は [F]、ディレクトリの場合は [D]と表示しています。



フィルタ(FileFileter, FilenameFilter)

listFilesメソッドを使用すれば、ファイルの一覧を取得することができます。

しかしファイルの数が膨大な場合、特定のファイルを見つけるのが困難になります

そのため特定の条件のファイルのみをフィルタリングして取得したいことがあります。

java.io.FileFilter」または「java.io.FilenameFilter」を使うことでファイルをフィルタリングし、指定した条件のファイルを取得することができます。


ファイル一覧にフィルタをかけるには「java.io.FileFilter」や「java.io.FilenameFilter」のインタフェースを実装したクラスを使用します。

「java.io.FileFilter」や「java.io.FilenameFilter」はどちらも acceptメソッドを持っています。

acceptメソッドは指定されたファイルをリストに含めるか判定します。

指定された抽象パス名をリストに含める場合には true 、含めない場合には false を返します。


java.io.FileFilter

java.io.FileFilterファイル名以外(ファイル名も可)でフィルタリングするインターフェースになります。

ファイル名以外とはFileクラスから取得できるファイルの属性などを指します。

acceptメソッドのパラメータにFileのインスタンスを指定することでファイルの属性などを含めてフィルタリングができます。

Fileクラスから取得できる属性は「ファイルサイズ」、「ファイル更新日時」、「ファイルかどうか」、「ディレクトリかどうか」などがこれに当たります。

listFilesメソッドでFileオブジェクトのリストを取得するとき、引数にFileFilterを設定すると指定されたフィルターを使って対象となるFileオブジェクトのリストを抽出します。

java.io.FileFilter」を使用するためには「import java.io.FileFilter」をインポートします。


java.io.FileFilterの使い方

import java.io.File;
import java.io.FileFilter;

class FileFilterTextExtension implements FileFilter {
	@Override
	public boolean accept(File pathname) {
		if (pathname.getName().endsWith(".txt")) {
			return true;
		}
		return false;
	}
}

public class Sample2_1 {
	public static void main(String[] args) {
		File dir = new File("D:\\Sample");

		File[] files = dir.listFiles(new FileFilterTextExtension());
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				System.out.println(files[i].toString());
			}
		}
	}
}


実行結果:

D:\Sample\abc.txt
D:\Sample\target.txt
D:\Sample\test00.txt
D:\Sample\test01.txt
D:\Sample\test02.txt

Sample2_1ではSample1で一覧取得したファイルのフィルタリングを行っています。

条件としてファイル名の最後が「.txt」であるものを acceptメソッドで許可しています。

その結果、「.txt」の拡張子が付くファイルのみが出力されています。



java.io.FilenameFilter

java.io.FilenameFilterファイル名でフィルタリングするインターフェースになります。

acceptメソッドのパラメータにFileのインスタンスと対象パスのファイル名かディレクトリ名を指定することでファイル名によるフィルタリングができます。

Fileオブジェクトの配列を取得するときにFilenameFilterを引数に与えると、指定されたファイルをファイル・リストに含めるかどうかをテストします。

「java.io.FilenameFilter」を使用するためには「import java.io.FilenameFilter」をインポートします。


java.io.FilenameFilterを使ったサンプルコードを確認しましょう。

import java.io.File;
import java.io.FilenameFilter;

class FilenameFilterExtension implements FilenameFilter {

	@Override
	public boolean accept(File pathname, String name) {
		if (name.indexOf("a") != -1) {
			return true;
		}
		return false;
	}
}

public class Sample2_2{
	public static void main(String[] args) {
		File dir = new File("D:\\Sample");
		File[] files = dir.listFiles(new FilenameFilterExtension());

		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				System.out.println(files[i].toString());
			}
		}
	}
}


実行結果:

D:\Sample\abc.txt
D:\Sample\target.txt

Sample2_2ではSample1で一覧取得したファイルのフィルタリングを行っています。

条件としてファイル名に「a」が付くファイルを acceptメソッドで許可しています。

その結果、ファイル名に「a」が付くファイルのみが出力されています。



まとめ

この記事ではファイル一覧の取得とフィルタについて解説しました。

ファイルの一覧取得をすることでそのディレクトリに何があるのかを瞬時に見ることができます。

また取得した一覧をフィルタリングすることで自由に指定した条件のファイルのみを表示することができます。

探したいファイルやディレクトリを探すの時に役に立つと思います。

ぜひこの記事で学習して覚えましょう。

ファイル操作についてもっと学習したい方は「【Java】java.io.Fileクラスを使えばファイル・ディレクトリ操作ができる!?の記事も併せて読んでみてください。


関連記事リンク:【Java】java.io.Fileクラスを使えばファイル・ディレクトリ操作ができる!?【Java】if文?switch文? 条件分岐の追加方法など使い方を解説!【Java】while文や for文などの反復処理(繰り返し構文)と breakや continueなどの反復制御の使い方!



【著者】

松倉祥大

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

編集した記事一覧

正社員/フリーランスの方でこのようなお悩みありませんか?

  • 自分に合う案件を定期的に紹介してもらいたい
  • 週2、リモートワークなど自由な働き方をしてみたい
  • 面倒な案件探し・契約周りは任せて仕事に集中したい

そのような方はぜひ、Workteriaサイトをご利用ください!

  • 定期的にご本人に合う高額案件を紹介

  • リモートワークなど自由な働き方ができる案件多数

  • 専属エージェントが契約や請求をトータルサポート

よく読まれている記事
【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】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

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