web-dev-qa-db-ja.com

Javaでのファイルの移動/コピー操作

ファイル/フォルダーの移動/コピーなどの一般的なファイル操作を処理する標準のJavaライブラリはありますか?

70
MSumulong

Java.nio操作でこれを行う方法は次のとおりです。

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();

        // previous code: destination.transferFrom(source, 0, source.size());
        // to avoid infinite loops, should be:
        long count = 0;
        long size = source.size();              
        while((count += destination.transferFrom(source, count, size-count))<size);
    }
    finally {
        if(source != null) {
            source.close();
        }
        if(destination != null) {
            destination.close();
        }
    }
}
72
Rigo Vides

まだではありませんが、 新しいNIO(JSR 203) はこれらの一般的な操作をサポートします。

それまでの間、留意すべきことがいくつかあります。

File.renameTo は、通常、同じファイルシステムボリュームでのみ機能します。これは「mv」コマンドに相当すると考えています。可能であれば使用しますが、一般的なコピーと移動のサポートにはフォールバックが必要です。

名前の変更が機能しない場合は、実際にファイルをコピーする必要があります(元のファイルを「移動」操作の場合は File.delete で削除します)。これを最大の効率で行うには、 FileChannel.transferTo または FileChannel.transferFrom メソッドを使用します。実装はプラットフォーム固有ですが、一般に、あるファイルから別のファイルにコピーする場合、実装はカーネルとユーザー空間の間でデータをやり取りすることを避け、効率を大幅に向上させます。

40
erickson

チェックアウト: http://commons.Apache.org/io/

コピーがあり、前述のように、JDKにはすでに動きがあります。

独自のコピー方法を実装しないでください。そこにはたくさんの人が浮かんでいます...

17
Pyrolistical

以前の回答は時代遅れのようです。

Javaの File.renameTo() は、おそらくAPI 7の最も簡単なソリューションであり、正常に動作するようです。例外をスローしないが、true/falseを返すことに注意してください!!!

以前のバージョンでは問題があるようです( [〜#〜] nio [〜#〜] と同じ)。

以前のバージョンを使用する必要がある場合は、 here を確認してください。

Here's an example for API7:
        File f1= new File("C:\\Users\\.....\\foo");
        File f2= new File("C:\\Users\\......\\foo.old");
        System.err.println("Result of move:"+f1.renameTo(f2));

代わりに:

    System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI());
    Path b1=Files.move(f1.toPath(),  f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING ););
    System.err.println("Move: RETURNS:"+b1);
10
ntg

GoogleのGuavaライブラリには次のものもあります。

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html

8
Andrew McKinlay

org.Apache.commons.io.FileUtils (一般的なファイル操作ユーティリティ)を使用してみてください。施設は次の方法で提供されます。

(1) FileUtils.moveDirectory(File srcDir、File destDir) =>ディレクトリを移動します。

(2) FileUtils.moveDirectoryToDirectory(File src、File destDir、boolean createDestDir) =>ディレクトリを別のディレクトリに移動します。

(3) FileUtils.moveFile(File srcFile、File destFile) =>ファイルを移動します。

(4) FileUtils.moveFileToDirectory(File srcFile、File destDir、boolean createDestDir) =>ファイルをディレクトリに移動します。

(5) FileUtils.moveToDirectory(File src、File destDir、boolean createDestDir) =>ファイルまたはディレクトリを宛先ディレクトリに移動します。

シンプル、簡単、高速です。

7
Dellanio

興味深い観察:さまざまなJavaクラスおよび印刷時間(ナノ秒)で同じファイルをコピーしようとしました。

FileOutputStreamバイトストリームを使用した期間:4 965 078

BufferedOutputStreamを使用した期間:1 237 206

使用時間(文字テキストリーダー:2 858 875

BufferedReaderを使用した期間(バッファリングされた文字テキストストリーム:1 998 005

使用期間(ファイルNIOコピー):18 351 115

files Nioのコピーオプションを使用すると、ほぼ18倍の時間がかかりました!!! Nioはファイルをコピーする最も遅いオプションであり、BufferedOutputStreamは最速のように見えます。各クラスに同じ単純なテキストファイルを使用しました。

0
Elena