【Java入門】Fileのコピー方法まとめ

Javaでファイル操作に使用するFileクラスはさまざまな機能があります。

この記事では、ファイル操作で必要な、

  • ファイルをコピーする方法
  • ファイルを削除する方法
  • java.nio.FileChannelクラスを使用してコピーする方法
  • ディレクトリをコピーする方法
  • ファイルの更新日時を変更する方法

などの基本的な内容から、応用的な使い方に関しても解説していきます。

今回はそんなファイルをコピーする方法について、さまざまな方法をわかりやすく解説します!

ファイルをコピーする方法

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入門】Fileの削除(delete、強制削除、拡張子の指定)
更新日 : 2017年8月23日

ディレクトリをコピーする方法

ディレクトリのコピーは、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回打ち込むだけで簡単にできるものではありません。

もしファイルをコピーする方法を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

侍ブログ編集部

侍ブログ編集部

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。プログラミングに役立つ情報や有用な情報を発信していきます。
サービスページはこちら
ツイッターはこちら
フェイスブックはこちら

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説