Javaでファイルをコピーする標準的な簡潔な方法は?質問する

Javaでファイルをコピーする標準的な簡潔な方法は?質問する

Java でファイルをコピーする唯一の方法が、ストリームを開いて、バッファを宣言し、1 つのファイルを読み込み、ループして、他のストリームに書き出すことであることには、いつも困惑していました。Web には、このタイプのソリューションの類似した、しかしわずかに異なる実装が散在しています。

Java 言語の範囲内で (つまり、OS 固有のコマンドを実行しない) もっと良い方法はありますか? おそらく、信頼できるオープン ソース ユーティリティ パッケージで、少なくともこの基礎となる実装をわかりにくくし、1 行のソリューションを提供できるのではないでしょうか。

ベストアンサー1

Apache Commons のようなメガ API の使用は避けたほうがよいでしょう。これは単純な操作であり、新しい NIO パッケージの JDK に組み込まれています。以前の回答ですでにリンクされていましたが、NIO API の重要なメソッドは新しい関数「transferTo」と「transferFrom」です。

http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)

リンクされている記事の 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 に導入された場合、学習するのは非常に難しい場合があります。

おすすめ記事