Java でファイルをコピーする唯一の方法が、ストリームを開いて、バッファを宣言し、1 つのファイルを読み込み、ループして、他のストリームに書き出すことであることには、いつも困惑していました。Web には、このタイプのソリューションの類似した、しかしわずかに異なる実装が散在しています。
Java 言語の範囲内で (つまり、OS 固有のコマンドを実行しない) もっと良い方法はありますか? おそらく、信頼できるオープン ソース ユーティリティ パッケージで、少なくともこの基礎となる実装をわかりにくくし、1 行のソリューションを提供できるのではないでしょうか。
ベストアンサー1
Apache Commons のようなメガ API の使用は避けたほうがよいでしょう。これは単純な操作であり、新しい NIO パッケージの JDK に組み込まれています。以前の回答ですでにリンクされていましたが、NIO API の重要なメソッドは新しい関数「transferTo」と「transferFrom」です。
リンクされている記事の 1 つでは、transferFrom を使用してこの関数をコードに統合する優れた方法が示されています。
public static void copyFile(File sourceFile, File destFile) throws IOException {
if(!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
}
finally {
if(source != null) {
source.close();
}
if(destination != null) {
destination.close();
}
}
}
NIO の学習は少し難しいので、一晩で NIO を学習しようとする前に、このメカニズムを信頼することをお勧めします。個人的な経験から言うと、経験がなく、java.io ストリームを介して IO に導入された場合、学習するのは非常に難しい場合があります。