71

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

4

7 に答える 7

73

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();
        }
    }
}
于 2009-05-26T07:28:27.570 に答える
41

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

それまでの間、覚えておくべきことがいくつかあります。

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

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

于 2008-11-18T23:38:12.813 に答える
17

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

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

独自のコピーメソッドを実装しないでください。そこにはたくさんの浮かんでいます...

于 2008-11-18T23:41:43.710 に答える
10

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

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

以前のバージョンでは問題があるように見えることに注意してください ( NIOと同じ)。

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

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);
于 2012-06-06T13:02:34.477 に答える
8

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

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

于 2010-07-05T16:14:13.430 に答える
7

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) => ファイルまたはディレクトリを移動先ディレクトリに移動します。

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

于 2013-02-01T12:54:17.130 に答える
0

興味深い観察: さまざまな 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 は最速のように見えます。各クラスに同じ単純なテキスト ファイルを使用しました。

于 2017-01-09T09:43:44.593 に答える