ファイル/フォルダの移動/コピーなどの一般的なファイル操作を処理する標準のJavaライブラリはありますか?
7 に答える
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と同じ)。
以前のバージョンを使用する必要がある場合は、こちらを確認してください。
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 は最速のように見えます。各クラスに同じ単純なテキスト ファイルを使用しました。