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回打ち込むだけで簡単にできるものではありません。
もしファイルをコピーする方法を忘れてしまったら、この記事を思い出してくださいね!






