Es hat mich immer gestört, dass die einzige Möglichkeit, eine Datei in Java zu kopieren, darin besteht, Streams zu öffnen, einen Puffer zu deklarieren, eine Datei einzulesen, sie zu durchlaufen und in den anderen Steam zu schreiben. Das Web ist übersät mit ähnlichen, aber immer noch leicht unterschiedlichen Implementierungen dieser Art von Lösung.
Gibt es einen besseren Weg, der innerhalb der Grenzen der Java-Sprache bleibt (was bedeutet, dass keine betriebssystemspezifischen Befehle ausgeführt werden müssen)? Vielleicht würde dies in einem zuverlässigen Open-Source-Dienstprogramm diese zugrunde liegende Implementierung zumindest verdecken und eine einzeilige Lösung bieten?
Antworten:
Wie oben erwähnt, ist Apache Commons IO der richtige Weg, insbesondere FileUtils . copyFile () ; Es erledigt das ganze schwere Heben für Sie.
Beachten Sie als Postskriptum, dass neuere Versionen von FileUtils (wie die Version 2.0.1) die Verwendung von NIO zum Kopieren von Dateien hinzugefügt haben. NIO kann die Leistung beim Kopieren von Dateien erheblich steigern , zum großen Teil, weil die NIO-Routinen das Kopieren direkt in das Betriebssystem / Dateisystem verzögern, anstatt es durch Lesen und Schreiben von Bytes über die Java-Schicht zu handhaben. Wenn Sie also nach Leistung suchen, sollten Sie überprüfen, ob Sie eine aktuelle Version von FileUtils verwenden.
quelle
Ich würde die Verwendung einer Mega-API wie Apache Commons vermeiden. Dies ist eine vereinfachte Operation, die im neuen NIO-Paket in das JDK integriert ist. Es war bereits in einer früheren Antwort verlinkt, aber die Schlüsselmethode in der NIO-API sind die neuen Funktionen "transferTo" und "transferFrom".
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)
Einer der verlinkten Artikel zeigt eine großartige Möglichkeit, wie Sie diese Funktion mithilfe von transferFrom in Ihren Code integrieren können:
Das Erlernen von NIO kann etwas schwierig sein. Vielleicht möchten Sie einfach auf diesen Mechaniker vertrauen, bevor Sie loslegen und versuchen, NIO über Nacht zu lernen. Aus persönlicher Erfahrung kann es sehr schwierig sein zu lernen, wenn Sie nicht über die Erfahrung verfügen und über die java.io-Streams mit IO vertraut gemacht wurden.
quelle
Mit Java 7 können Sie jetzt die folgende Try-with-Resource-Syntax verwenden:
Besser noch, dies kann auch mit der in Java 7 eingeführten neuen Files-Klasse erreicht werden:
Ziemlich schick, oder?
quelle
Die Utility-Klasse
Kopieren eines Verzeichnisses oder einer Datei
Verschieben eines Verzeichnisses oder einer Datei
Rekursives Kopieren eines Verzeichnisses oder einer Datei
quelle
In Java 7 ist es einfach ...
quelle
Um eine Datei zu kopieren und in Ihrem Zielpfad zu speichern, können Sie die folgende Methode verwenden.
quelle
Beachten Sie, dass alle diese Mechanismen nur den Inhalt der Datei kopieren, nicht die Metadaten wie Berechtigungen. Wenn Sie also eine ausführbare .sh-Datei unter Linux kopieren oder verschieben, ist die neue Datei nicht ausführbar.
Um eine Datei wirklich zu kopieren oder zu verschieben, dh um das gleiche Ergebnis wie beim Kopieren über eine Befehlszeile zu erzielen, müssen Sie tatsächlich ein natives Tool verwenden. Entweder ein Shell-Skript oder JNI.
Anscheinend könnte dies in Java 7 behoben werden - http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html . Daumen drücken!
quelle
Die Guava-Bibliothek von Google verfügt außerdem über eine Kopiermethode :
Warnung: Wenn es sich
to
um eine vorhandene Datei handelt, wird diese Datei mit dem Inhalt von überschriebenfrom
. Wennto
undfrom
auf dieselbe Datei verweisen , wird der Inhalt dieser Datei gelöscht.Parameter:
from
- die Quelldateito
- die ZieldateiAuslöser:
IOException
- wenn ein E / A-Fehler auftrittIllegalArgumentException
- wennfrom.equals(to)
quelle
In Java 7 standardmäßig verfügbar: path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ Tutorial / essential / io / copy.html
Ich kann nicht glauben, dass sie so lange gebraucht haben, um etwas so Standardisiertes und Einfaches wie das Kopieren von Dateien zu standardisieren :(
quelle
Drei mögliche Probleme mit dem obigen Code:
Deshalb
org.apache.tools.ant.util.ResourceUtils.copyResource
ist es so kompliziert. Beachten Sie auch, dass transferTo unter JDK 1.4 unter Linux unterbrochen wird (siehe Fehler-ID: 5056395 ) - Jesse Glick Jan.quelle
Wenn Sie sich in einer Webanwendung befinden, die Spring bereits verwendet, und wenn Sie Apache Commons IO nicht zum einfachen Kopieren von Dateien einschließen möchten, können Sie FileCopyUtils des Spring-Frameworks verwenden.
quelle
Hier sind drei Möglichkeiten, wie Sie Dateien einfach mit einer einzigen Codezeile kopieren können!
Java7 :
java.nio.file.Files # copy
Appache Commons IO :
FileUtils # copyFile
Guave :
Dateien # kopieren
quelle
Files.copy
mit nur 2 Parametern ist fürPath
zuStream
. Fügen Sie einfach den ParameterStandardCopyOption.COPY_ATTRIBUTES
oderStandardCopyOption.REPLACE_EXISTING
fürPath
zuPath
quelle
NIO-Kopie mit Puffer ist nach meinem Test die schnellste. Den folgenden Arbeitscode aus einem meiner Testprojekte finden Sie unter https://github.com/mhisoft/fastcopy
}}
quelle
Schnell und arbeiten mit allen Versionen von Java auch Android:
quelle
Ein wenig zu spät zur Party, aber hier ist ein Vergleich der Zeit, die zum Kopieren einer Datei mit verschiedenen Dateikopiermethoden benötigt wird. Ich habe die Methoden 10 Mal durchlaufen und einen Durchschnitt ermittelt. Die Dateiübertragung mit E / A-Streams scheint der schlechteste Kandidat zu sein:
Hier sind die Methoden:
Der einzige Nachteil, den ich bei der Verwendung der NIO-Kanalklasse feststellen kann, ist, dass ich immer noch keine Möglichkeit finde, den Fortschritt beim Kopieren von Zwischendateien anzuzeigen.
quelle