Gibt es eine Standard-Java-Bibliothek, die allgemeine Dateivorgänge wie das Verschieben / Kopieren von Dateien / Ordnern verarbeitet?
70
So geht's mit java.nio
Operationen:
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();
}
}
}
File.renameTo
das nicht so gut ist wieFiles.move
?Files.move
Sie, warum, anstatt einfach zurückzukehrenfalse
. UndFiles.move
kann Bewegungen verarbeiten, die keine einfachen Umbenennungen sind, dh ein Kopieren und Löschen erfordern.Noch nicht, aber das neue NIO (JSR 203) wird diese gemeinsamen Operationen unterstützen.
In der Zwischenzeit sind einige Dinge zu beachten.
File.renameTo funktioniert im Allgemeinen nur auf demselben Dateisystem-Volume. Ich betrachte dies als das Äquivalent zu einem "mv" -Befehl. Verwenden Sie es, wenn Sie können, aber für die allgemeine Unterstützung beim Kopieren und Verschieben benötigen Sie einen Fallback.
Wenn eine Umbenennung nicht funktioniert, müssen Sie die Datei tatsächlich kopieren (Löschen des Originals mit File.delete, wenn es sich um einen Verschiebungsvorgang handelt). Verwenden Sie dazu die Methoden FileChannel.transferTo oder FileChannel.transferFrom , um dies mit größter Effizienz zu erreichen . Die Implementierung ist plattformspezifisch, aber im Allgemeinen vermeiden Implementierungen beim Kopieren von einer Datei in eine andere das Hin- und Hertransportieren von Daten zwischen Kernel und Benutzerbereich, was zu einer erheblichen Effizienzsteigerung führt.
quelle
Überprüfen Sie heraus: http://commons.apache.org/io/
Es hat eine Kopie, und wie gesagt, das JDK hat sich bereits bewegt.
Implementieren Sie keine eigene Kopiermethode. Es schwimmen so viele da draußen ...
quelle
Never implement your own utilities when there are quality libraries out there.
suure, wenn Sie sich nie um die Lizenzierung sorgen müssen.Frühere Antworten scheinen veraltet zu sein.
Javas File.renameTo () ist wahrscheinlich die einfachste Lösung für API 7 und scheint gut zu funktionieren. Seien Sie vorsichtig, es wirft keine Ausnahmen, sondern gibt wahr / falsch zurück !!!
Beachten Sie, dass es in früheren Versionen Probleme zu geben scheint (wie bei NIO ).
Wenn Sie eine frühere Version verwenden müssen, klicken Sie hier .
Hier ist ein Beispiel für 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));
Alternative:
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);
quelle
Die Guava-Bibliothek von Google bietet außerdem Folgendes:
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html
quelle
Versuchen Sie, org.apache.commons.io.FileUtils (Allgemeine Dienstprogramme zur Dateibearbeitung ) zu verwenden. Die Einrichtungen werden auf folgende Weise bereitgestellt:
Es ist einfach, leicht und schnell.
quelle
Interessante Beobachtung: Es wurde versucht, dieselbe Datei über verschiedene Java-Klassen und die gedruckte Zeit in Nanosekunden zu kopieren.
Dauer mit FileOutputStream-Bytestream: 4 965 078
Dauer mit BufferedOutputStream: 1 237 206
Dauer mit (Zeichentext Reader: 2 858 875
Dauer mit BufferedReader (Textstrom für gepufferte Zeichen: 1 998 005
Dauer mit (Dateien NIO-Kopie): 18 351 115
Bei Verwendung der Datei-Nio-Kopieroption dauerte es fast 18-mal länger !!! Nio ist die langsamste Option zum Kopieren von Dateien und BufferedOutputStream scheint die schnellste zu sein. Ich habe für jede Klasse dieselbe einfache Textdatei verwendet.
quelle