Javaでプログラムを行う際、既存ファイルを指定したフォルダにコピーしたいといった要件はよくあります。
本記事では、Filesクラスを使って既存ファイルをコピーする方法をJavaのサンプルコードを掲載しながらご紹介していきます。
目次
Java標準Filesクラスのcopyメソッドを利用する
Javaでは、「java.nio」パッケージの「Files」クラスから「copy」メソッドを利用することで、ファイルのコピーが簡単に行えます。
基本的な使い方
copyメソッドでは第1引数にコピー元、第2引数にコピー先を指定します。
引数はPathクラスとして設定する必要があるので実際には下記のような使い方となります。
Path originalPath = Paths.get("ファイルのパス"); Path targetPath = Paths.get("ファイルのパス"); Files.copy(originalPath, targetPath);
サンプル
サンプルでは、指定したファイルを別ディレクトリに名前を変えてコピーしてみたいと思います。
フォルダ構成
まず現状のフォルダ構成を確認しておきましょう。
$ tree . ├── bin │ └── Main.class ├── original │ └── sample1.txt ├── src │ └── Main.java └── target
実装
「original」に格納された「sample1.txt」ファイルを「target」へ「sample2.txt」としてコピーします。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { try { Path originalFile = Paths.get("./original/sample1.txt"); Path targetFile = Paths.get("./target/sample2.txt"); Files.copy(originalFile, targetFile); System.out.println("コピー処理が完了しました。"); } catch (IOException ex) { ex.printStackTrace(); } } }
このプログラムを実行すると、コンソールに「コピー処理が完了しました。」と表示されれば、targetフォルダにsample2.txtが作成されているはずです。
$ tree . ├── bin │ └── Main.class ├── original │ └── sample1.txt ├── src │ └── Main.java └── target └── sample2.txt
ディレクトリ指定でのコピーは出来ない点に注意
copyメソッドでは、「txt」以外の拡張子ファイルのコピーも可能ですが、ディレクトリ単位でのコピーは出来ません。
例えば上記のサンプル実装を下記のように修正して実行してみましょう。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { try { Path originalFile = Paths.get("./original"); Path targetFile = Paths.get("./test"); Files.copy(originalFile, targetFile); System.out.println("コピー処理が完了しました。"); } catch (IOException ex) { ex.printStackTrace(); } } }
このコードを実行すると結果は下記のようになります。
$ tree . ├── bin │ └── Main.class ├── original │ └── sample1.txt ├── src │ └── Main.java ├── target └── test
「コピー処理が完了しました。」とコンソールに出力され、「test」フォルダは作成されますが、中身のファイルまではコピーされません。
Java標準メソッドとしては、フォルダ内のファイルを丸ごとコピーするような処理は提供されていないため、注意が必要です。
同名ファイルがコピー先に存在する場合のJavaオプション
copyメソッドを利用する場合、コピー先に同名ファイルが存在するとエラーが発生してしまいます。
対応策として、オプション引数に「REPLACE_EXISTING」を指定することで上書きコピーが可能となるので確認していきましょう。
オプションの指定方法
「REPLACE_EXISTING」の指定方法は、copyメソッドの第3引数として記述するだけです。
Files.copy(コピー元, コピー先, REPLACE_EXISTING);
サンプル
上記copyメソッドのサンプルで作成した実装コードを再度実行してみましょう。
すると「java.nio.file.FileAlreadyExistsException」が表示され、処理に失敗してしまいます。
次に第3引数にオプションを指定して、下記のように実装を変えてみましょう。
import static java.nio.file.StandardCopyOption.*; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { try { Path originalFile = Paths.get("./original/sample1.txt"); Path targetFile = Paths.get("./target/sample2.txt"); Files.copy(originalFile, targetFile, REPLACE_EXISTING); System.out.println("コピー処理が完了しました。"); } catch (IOException ex) { ex.printStackTrace(); } } }
実行すると、treeコマンドの結果は変わりませんが、ファイルが上書きコピーされています
さいごに: copyメソッドでJavaプログラムからファイルをコピーしてみよう
本記事では、Javaでのファイルコピーについて、サンプルコードを掲載しながらcopyメソッドの使い方をご紹介してきました。
copyメソッド自体は、使い方も簡単なので、初心者の方でも容易に扱えるはずです。
コピー先に同名ファイルが存在する場合に、上書きして良いのか、エラーとすべきかをきちんと確認した上でcopyメソッドを活用してみてください。