質問
ファイル/フォルダーの移動/コピーなどの一般的なファイル操作を処理する標準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は最速のように見えます。各クラスに同じシンプルなテキストファイルを使用しました。