質問

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

役に立ちましたか?

解決

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

他のヒント

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

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

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

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

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

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

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

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

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

以前のバージョンでは問題があるようです( NIO )。

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

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

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

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

org.apache.commons.io.FileUtils (一般的なファイル操作ユーティリティ)。施設は次の方法で提供されます:

  

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

     

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

     

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

     

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

     

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

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

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

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

BufferedOutputStreamを使用する期間:1 237 206

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

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

(Files NIOコピー)を使用した期間:18 351 115

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top