commons-io に見るファイル操作処理のヒント(FileUtils編その1)

公開日: : 最終更新日:2014/01/27 commons-io ,

今回も commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装のヒントになりそうなスニペットのメモ企画。

commons-io に見るファイル操作処理のヒント(IOUtils編) に引き続く第3回目。
今回は FileUtils (Commons IO 2.4 API) です。

commons-io

目次

1. ディレクトリを削除する

  • cleanDirectory(File directory)
  • deleteDirectory(File directory)
  • deleteQuietly(File file)
  • forceDelete(File file)
  • forceDeleteOnExit(File file)

ディレクトリ削除系のメソッドはこれら5つが用意されています。
誤りがあるかもしれませんが、概ね実装の違いはそれぞれ次の通りになっています。

cleanDirectory

  • 引数で指定したディレクトリ(File オブジェクト)は削除しない
  • ディレクトリに存在するファイルとサブディレクトリを削除する
  • 次の場合に例外を投げる
    • 指定したディレクトリが存在しない
    • 指定したディレクトリがディレクトリではなかった
    • 指定したディレクトリの中身が空だった

deleteDirectory

  • 引数で指定したディレクトリ(File オブジェクト)ごと削除する
  • 内部では cleanDirectory を呼んでいる

deleteQuietly

  • 引数で指定したディレクトリ(File オブジェクト)ごと削除する
  • 内部では cleanDirectory を呼んでいる
  • 削除に失敗した場合は例外を投げるのではなく false を返す

forceDelete

  • 内部では deleteDirectory を呼んでいる

どういう部分が force だから名前に “force” が付いているのかは不明。

forceDeleteOnExit

  • JVM 終了時に引数で指定したディレクトリ(File オブジェクト)ごと削除する

ざっと見ただけなので見落としがありそうだけど、deleteDirectoryforceDelete の違いが分からなかった。うーん。

2. ファイルの中身を比較する

  • contentEquals(File file1, File file2)
  • contentEqualsIgnoreEOL(File file1, File file2, String charsetName)

IOUtils にも同様の処理を行うメソッドが用意されています。

  • IOUtils#contentEquals
  • IOUtils#contentEqualsIgnoreEOL

IOUtils のメソッドとの違いは、引数に指定するクラスの型です。
実ファイルが存在する場合は FileUtils の contentEquals を使えばいいと思います。

contentEqualsIgnoreEOL は IOUtils と同様に改行コードを比較したくない場合に使います。

3. ディレクトリをコピーする

次のパラメータを受け取るメソッドが用意されています。

  • copyDirectory(File srcDir, File destDir)
  • copyDirectory(File srcDir, File destDir, boolean preserveFileDate)
  • copyDirectory(File srcDir, File destDir, FileFilter filter)
  • copyDirectory(File srcDir, File destDir, FileFilter filter, boolean preserveFileDate)

このメソッドの特徴は次のようになるかと思います。

  • サブディレクトリも含めて再帰的にコピーする
  • ファイルの最終更新日時も引き継がれる
  • コピー先のディレクトリが存在しない場合は作成する
  • フィルタを使うことでコピーしたいファイルの種類を指定できる

最終更新日時の引き継ぎ

1番目と3番目のメソッドは、最終更新日時が引き継がれます。

また、preserveFileDate を引数で指定する2番目と4番目のメソッドは true ならば最終更新日時を引き継ぐようになっています。

  • preserveFileDate = true → 最終更新日時を引き継ぐ
  • preserveFileDate = false → 最終更新日時は引き継がない
  • preserveFileDate を指定できない → 最終更新日時を引き継ぐ

コピーしたいファイルのフィルタリング

コピーするファイルをフィルタリングすることができます。

次は JavaDoc にあった例になります。
拡張子が txt のファイルと、ディレクトリをコピーしたい場合のフィルタリングは次のように指定するようです。

// Create a filter for ".txt" files
IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");
IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);

// Create a filter for either directories or ".txt" files
FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);

// Copy using the filter
FileUtils.copyDirectory(srcDir, destDir, filter);

4. ディレクトリを移動する

  • moveDirectory(File srcDir, File destDir)
  • moveDirectoryToDirectory(File src, File destDir, boolean createDestDir)

moveDirectory は destDir が存在していると例外を投げるようになっています。

次のようなフローで実装されていました。

  1. renameTo を使ってディレクトリをリネームする
  2. リネーム処理に失敗したら、ディレクトリをコピー + 元ディレクトリの削除を行う

また、moveDirectoryToDirectory は src を destDir のサブディレクトリとする場合に使います。
ですので、destDir が存在しないと例外が投げられます。

createDestDir に true を設定すると、ディレクトリを作ってくれます。

5. ファイルをコピーする

  • copyFile(File srcFile, File destFile)
  • copyFile(File srcFile, File destFile, boolean preserveFileDate)
  • copyFile(File input, OutputStream output)

ディレクトリをコピーするメソッドとして copyFile が用意されています。

このメソッドの特徴は次のようになるかと思います。

  • 最終更新日時を引き継ぐか引数で指定できる
  • コピー先のファイルが存在しない場合は作成する
  • コピー先のファイルが存在する場合は上書きする

最終更新日時に扱いはディレクトリのコピーと同じ

コピーの際の最終更新日時の扱いは copyDirectory と同じです。

1番目のメソッドは最終更新日時を引き継ぎ、2番目のメソッドは preserveFileDate で引き継ぐかを選択できます。

コピー先に OutputStream を指定可能

コピー先に OutputStream を指定できるのは地味に便利かもしれないなぁと思っています。
例えば、読み込んだリソースをサーブレットのレスポンスとしてそのまま返す場合は、次のように簡潔に書けちゃいます。

File file = new File("xxx");
FileUtils.copyFile(file, response.getOutputStream());

6. ファイルをディレクトリにコピーする

  • copyFileToDirectory(File srcFile, File destDir)
  • copyFileToDirectory(File srcFile, File destDir, boolean preserveFileDate)

ファイルをディレクトリにコピーするためのメソッドとして copyFileToDirectory が用意されています。

最終更新日時に扱いはディレクトリのコピーと同じ

コピーの際の最終更新日時の扱いは copyDirectory と同じです。

1番目のメソッドは最終更新日時を引き継ぎ、2番目のメソッドは preserveFileDate で引き継ぐかを選択できます。

7. ストリームをファイルにコピーする

  • copyInputStreamToFile(InputStream source, File destination)

stream をそのままファイルに書き出すメソッドも用意されています。

ブラウザからアップロードされたファイルを保存する場合に使えそうです。以下は、そのスニペットです。

Part part = request.getPart("file");
File file = new File("xxx");
FileUtils.copyInputStreamToFile(part.getInputStream(), file);

コピー先ファイルの扱い

コピー先のファイル(上記のシグニチャですと “destination”)ですが、ソースコードを見ると次のような扱いになっていました。

  • 実ファイルが存在すれば、上書きしてしまう
  • 実ファイルが存在しなければ、新規作成する

8. URL の指すリソースをファイルにコピーする

  • copyURLToFile(URL source, File destination)
  • copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout)

API などでリソースファイルの場所を教えてもらって、そのリソースファイルをコピーする場合に使えそうです。

ちなみに実装は次のようになっていました。
なるほどー。

public static void copyURLToFile(URL source, File destination) throws IOException {
    InputStream input = source.openStream();
    copyInputStreamToFile(input, destination);
}

まだメモしておきたいメソッドはあるが、長くなってきたので続きは別記事で。

9. その他の commons-io に関する記事

commons-io に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

AgeFileFilter を使ったフィルタ処理のサンプル

Commons IO の org.apache.commons.io.filefilter (Com

記事を読む

commons-io

拡張子を指定したフィルタの実装サンプル

Commons-io の FileFilter のサンプルをいくつか書いてみたのでメモしておきます。

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(FileBasedTestCase編)

次のプロジェクトはファイルを頻繁に扱うので、楽を出来ないかと Commons IO の JavaDo

記事を読む

icatch-teacher_3509507274_mini-thumbnail

commons-io に見るファイル操作処理のヒント(FilenameUtils編)

commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装のヒント

記事を読む

icatch-8597609828_ab32aba876_z-resized

SizeFileFilter を使ったフィルタ処理のサンプル

Commons IO の org.apache.commons.io.filefilter (Com

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(FileUtils編その2)

commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装のヒント

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(IOUtils編)

今回も commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装

記事を読む

icatch-8969238685_14dd418b01_z-resized

DirectoryFileFilter を使ったフィルタ処理のサンプル

Commons IO の org.apache.commons.io.filefilter (Com

記事を読む

icatch-lineiterator_mini

Commons IO の LineIterator#isValidLine メソッドをオーバーライドしたサンプル

CommonsIO にテキストファイルの読み込み処理で役立ちそうなクラスがあったので検証してみました

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


1 × = 八

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑