Javaでファイル操作に使用するFileクラスはさまざまな機能があります。
この記事では、ファイル操作で必要な、
- ファイルをコピーする方法
- ファイルを削除する方法
- java.nio.FileChannelクラスを使用してコピーする方法
- ディレクトリをコピーする方法
- ファイルの更新日時を変更する方法
などの基本的な内容から、応用的な使い方に関しても解説していきます。
今回はそんなファイルをコピーする方法について、さまざまな方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
ファイルをコピーする方法
Javaでファイルをコピーする方法はいくつかありますが、ファイル自体を簡単にコピーできるメソッドは存在しません。
ここでは、Java6でファイルをコピーする基本的な方法を2つ解説し、Java7で新しく追加されたファイルのコピー方法についても紹介します。
java.io.Fileクラスを使用してコピーする
ファイルコピーの基本的な方法として、java.io.FileクラスのFileInputStreamクラスと、FileOutputStreamクラスを使用してコピー元のファイルに内容を書き込む方法があります。
FileInputStreamは「import java.io.FileInputStream」、FileOutputStreamは「import java.io.FileOutputStream」のパッケージをインポートします。
以下にJava.io.Fileクラスを使用した、ファイルのコピー方法を記述します。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileClass{ public void fileInOut() throws IOException{ //FileInputStreamのオブジェクトを生成する FileInputStream fileIn = new FileInputStream("/Users/Shared/java/javaIn.txt"); //FileOutputStreamのオブジェクトを生成する FileOutputStream fileOut = new FileOutputStream("/Users/Shared/java/javaOut.txt"); // byte型の配列を宣言 byte[] buf = new byte[256]; int len; // ファイルの終わりまで読み込む while((len = fileIn.read(buf)) != -1){ fileOut.write(buf); } //ファイルに内容を書き込む fileOut.flush(); //ファイルの終了処理 fileOut.close(); fileIn.close(); } }
サンプルでは、FileInputStreamクラスでコピー元のファイルを指定してオブジェクトを生成し、FileOutputStreamクラスでコピー先のファイルを指定してオブジェクトを生成しています。
whileのループでFileInputStreamクラスのreadメソッドで内容を読み込み、FileOutputStreamクラスのwriteメソッドで内容を書き込んでいます。
書き加えられた情報はflushメソッドを使用して、内容を全てファイルに書き込みます。
また、すでにコピー先ファイルが存在する場合は、コピー元ファイルの内容が上書きされます。
java.nio.FileChannelクラスを使用してコピーする
FileChannelクラスのtransferToメソッドを使用することでも、ファイルをコピーすることが可能です。
transferToメソッドは第一引数にコピー開始位置を指定し、第二引数にコピーする最大バイト数を指定します。第三引数には出力先のファイルを指定することで、コピー元ファイルを参照して転送されます。
transferTo(long position, long count, WritableByteChannel target)
FileChannelクラスは「import java.nio.channels.FileChannel」をインポートする必要があります。
以下にFileChannelクラスを使用した、ファイルのコピー方法を記述します。
public class FileClass{ public void fileInOut() throws IOException{ File fileIn = new File("/Users/Shared/java/javaIn.txt"); File fileOut = new File("/Users/Shared/java/javaOut.txt"); // FileChannelクラスのオブジェクトを生成する @SuppressWarnings("resource") FileChannel inCh = new FileInputStream(fileIn).getChannel(); @SuppressWarnings("resource") FileChannel outCh = new FileOutputStream(fileOut).getChannel(); //transferToメソッドを使用してファイルをコピーする inCh.transferTo(0, inCh.size(), outCh); } }
サンプルでは、Fileクラスでコピー元とコピー先ファイルを指定して、オブジェクトを生成します。
次にFileChannelクラスからFileInputStreamクラスとFileOutputStreamクラスのgetChannelメソッドを使用して、ファイルに関連付けられたオブジェクトを生成します。
FileChannelクラスのtransferToメソッドを使用して、コピー先ファイルにコピー元ファイルの内容がコピーされます。
java.nio.file.Filesクラスを使用する
Java7では新しく追加されたjava.nio.file.Filesクラスでは、より簡潔にファイルをコピーすることが可能です。
java.nio.file.Filesクラスでのファイルのコピーは、以下の記事で詳しく解説しています!
ファイルを削除する方法
ファイルを削除するためには、Fileクラスのdeleteメソッドを使用します。
ファイルを削除する方法については、以下の記事で詳しく解説しています!
ディレクトリをコピーする方法
ディレクトリのコピーは、Java標準の「JDK」では専用のメソッドが用意されていないため、「commons-io」パッケージをインストールする必要があります。
ディレクトリのコピーは、「commons-io」パッケージのFileUtilsクラスを使用する必要があるため、「import org.apache.commons.io.FileUtils」をインポートします。
「commons-io」のパッケージは、Apache Commonsの以下のサイトからダウンロードできます。
https://commons.apache.org/proper/commons-io/download_io.cgi
以下にcommons-ioを使用した、ディレクトリのコピー方法を記述します。
public class FileClass{ public void fileInOut() throws IOException{ File DirIn = new File("/Users/Shared/java1"); File DirOut = new File("/Users/Shared/java2"); //copyDirectoryメソッドを使用してディレクトリをコピーする FileUtils.copyDirectory(DirIn, DirOut); } }
サンプルでは、Fileクラスでコピー元とコピー先ファイルを指定して、オブジェクトを生成します。
FileUtilsクラスのcopyDirectoryメソッドを使用して、第一引数にコピー元ディレクトリ、第二引数にコピー先ディレクトリのオブジェクトを指定しています。
ファイルの更新日時を変更する方法
ファイルの更新日時を変更する場合は、FileクラスのsetLastModifiedメソッドを使用します。
public boolean setLastModified(long time)
long型の引数には、変更する時刻を指定します。
以下に更新日時を変更する方法を記述します。
public class FileClass{ public void lastModified() throws IOException{ File file = new File("/Users/Shared/java/java.txt"); //Calendarクラスのオブジェクトを生成する Calendar cal = Calendar.getInstance(); //初期化する cal.clear(); //日時を設定する cal.set(2010, 1, 1, 13, 00, 30); //ファイルに日時をセットする file.setLastModified(cal.getTimeInMillis()); } }
サンプルではFileクラスで対象のファイルを指定し、clearメソッドで一旦内容を初期化しています。
次にCalendarクラスのset関数で変更したい日時を「年,月,日,時,分,秒」で設定し、setLastModifiedのメソッドの引数に指定しています。
これで対象のファイルの更新日時が変更されます。
Fileクラスについてもっと詳しく知りたい方へ
Fileクラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここでは、ファイルやディレクトリをコピーする方法や、更新日時の変更方法について説明しました。
Javaでのファイルのコピー処理は、WindowsのコマンドプロンプトやLinuxのターミナルのように、コマンドを1回打ち込むだけで簡単にできるものではありません。
もしファイルをコピーする方法を忘れてしまったら、この記事を思い出してくださいね!