【Java】transferFromを使ってファイルをコピーする!
ファイルをコピーするにはFileChannelクラスのtransferFromメソッドを使用します。
FileChannelクラスのtransferFromメソッドは、ファイルをコピーするメソッドとなります。
しかし、transferFromメソッドだけでは、ファイルのコピーができませんので注意してください。
ファイルコピーの基本的な方法として、「FileInputStream」クラスと「FileOutputStream」クラスを使用してコピー元のファイルに内容を書き込む必要があります。
FileChannelクラスからFileInputStreamクラスとFileOutputStreamクラスのgetChannel()メソッドを使用し、ファイルに関連付けられたオブジェクトを生成します。
そこで、FileChannelクラスのtransferFromメソッドを使用することで、コピー先ファイルにコピー元ファイルの内容がコピーされます。
ファイルをコピーする方法はいくつかありますが、今回はFileChannelクラスのtransferFromメソッドを使ってファイルをコピーしていきます。
また、Java7から追加されたFilesクラスのcopyメソッドを使って、ファイルをコピーする方法についても解説していきます。
目次
transferFromメソッドとは
FileChannelクラスのtransferFromメソッドとは、配列の要素コピーするメソッドであり、指定された配列をコピーし、指定された要素数分を新しい配列にコピーします。
transferFromメソッドの書き方
FileChannelクラスのtransferFromメソッドの構文は下記となります。
1 2 3 |
import java.nio.channels.FileChannel; FileChannel.transferFrom(コピーするファイル, コピーの開始位置, ファイルのサイズ); |
FileChannelクラスをインポートすることで、FileChannelクラスのメソッドを使用できます。
パラメータ
⚫︎ コピーするファイル:
コピーしたいファイル名を指定
⚫︎ コピーの開始位置:
コピーしたいファイルのコピーの開始位置を指定(基本は0)
⚫︎ ファイルのサイズ:
コピーしたいファイルの大きさを指定(sizeメソッドでファイルのサイズを指定)
transferFromの()に第1パラメータとしてコピーするファイルを、第2パラメータとしてコピーの開始位置を、第3パラメータとしてファイルのサイズを指定することでファイルをコピーします。
ファイルをコピーするサンプルコード
ファイルをコピーするサンプルコードを紹介します。
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
// ファイルをコピーする import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; public class Main { public static void main(String[] args) throws Exception { FileChannel srcChannel = null; FileChannel copyChannel = null; // コピー先ファイルの存在確認用 File copytFile = new File("copyFile.txt"); //コピー先ファイルの存在確認結果を表示する System.out.println( "コピー前の存在確認: " + copytFile.exists()); //コピー元ファイルチャネルのインスタンスを作成する srcChannel = new FileInputStream( "src.txt").getChannel(); // コピー先ファイルチャネルのインスタンスを作成する copyChannel = new FileOutputStream( "copyFile.txt").getChannel(); // ファイルをコピーする copyChannel.transferFrom( srcChannel, 0, srcChannel.size()); // コピー元ファイルチャネルのインスタンスを閉じる srcChannel.close(); // コピー先ファイルチャネルのインスタンスを閉じる copyChannel.close(); //コピー先ファイルの存在確認結果を表示 System.out.println( "コピー後の存在確認: " + copytFile.exists()); } } |
出力結果
コピー前の存在確認:false
コピー後の存在確認:true
コンソールから実行する場合はレントディレクトリに「src.txt」を用意します。
Eclipseで実行酢する場合は、プロジェクト直下に「src.txt」を用意します。
その状態でMain.javaを実行すると、「src.txt」をコピーした「copyFile.txt」が作成されます。
また、ChannelクラスのtransferToメソッドを使用しても同様の結果となります。
transferToメソッドを使う場合は、次のように記述します。
1 2 |
srcChannel.transferto( 0, srcChannel.size(), copyChannel); |
今回のポイント
transferFromでファイルをコピー
ファイルをコピーするにはFileChannelクラスのtransferFromメソッドを使用する
⚫︎ FileChannelクラスのtransferFromメソッドでファイルのコピーを行う
⚫︎ transferFromメソッドの第1パラメータはコピーするファイルを、第2パラメータはコピーの開始位置を、第3パラメータはファイルのサイズを指定する
⚫︎ transferToメソッドを使用してもtransferFromメソッドと同じ結果となる
⚫︎ ファイルをコピーするには、FileInputStreamクラスのgetChannelメソッドを使用してコピー元のファイルチャネルを取得し、FileOutputStreamクラスのgetChannelメソッドを使用してコピー先のファイルチャネルを取得した後にFileChannelクラスのtransferFromメソッドやtransferToメソッドを使用する
⚫︎ コピー元ファイルが読み込可能でない場合や、コピー先ファイルが書き込み可能でない場合は、例外が発生する
補足
NI0.2(Filesクラス)を使用してファイルをコピーする
NIO.2とはJava7で導入された「java.nio.file」パッケージとそのサブパッケージとを合わせたものであり、NIO.2のFilesクラスを使用することでとても簡単にファイル処理を行うことができます。
そのため、Filesクラスのcopyメソッドを呼び出すことで、ファイルをコピーすることができ、copyメソッドのパラメータには、以下のオプションを指定することができたり、複数のオプションを指定することもできます。
オプション | 説明 |
---|---|
StandardCopyOption.REPLACE_EXISTING | コピー先ファイルがすでに存在する場 合に上書きでコピーする |
StandardCopyOption.COPY_ATTRIBUTES | コピー元ファイルの属性を含めてコピーする(環境によって違いがある) |
StandardCopyOption.NOFOLLOW_LINKS | コピー元ファイルがシンボリックリンクの場合にリンク自体をコピーし、リンク先はコピーされない |
コピー先ファイルがすでに存在する場合、パラメーターオプションである「StandardCopyOption.REPLACE_EXISTING」を指定しないと、例外が発生します。
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Javaでファイルをコピーする import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class Main { public static void main(String[] args) throws Exception { //コピー元のファイル Path srcPath = Paths.get("src.txt"); //コピー先のファイル Path copyPath = Paths.get("copyFile.txt"); // コピー先ファイルの存在確認結果を表示する System.out.println( "コピー前の存在確認:" + Files.exists(copyPath)); // 上書きオプションを指定してファイルをコピーする。 Files.copy(srcPath, copyPath, StandardCopyOption.REPLACE_EXISTING); //コピー先ファイルの存在確認結果を表示する System.out.println( "コピー後の存在確認:" + Files.exists(copyPath)); } } |
出力結果
コピー前の存在確認:false
コピー後の存在確認:true
コンソールから実行する場合は、カレントディレクトリに「src.txt」を用意します。
Eclipseで実行する場合は、プロジェクト直下に「src.txt」でMain.javaを実行すると、「src.txt」をコピーした「copyFile.txt」が作成されます。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。