ファイル/フォルダーの移動/コピーなどの一般的なファイル操作を処理する標準の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 を確認してください。
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) =>ディレクトリを移動します。
(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) =>ファイルまたはディレクトリを宛先ディレクトリに移動します。
シンプル、簡単、高速です。
興味深い観察:さまざまな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は最速のように見えます。各クラスに同じ単純なテキストファイルを使用しました。