Java java.nio.file.Files copy()-Methode
java.nio.file.Files.copy()ist eine Hilfsmethode, die im Java-NIO-(New Input/Output-)Paket bereitgestellt wird und zum Kopieren von Dateien oder Verzeichnissen zwischen Dateisystemen verwendet wird. Diese Methode bietet im Vergleich zum traditionellenjava.ioPaket effizientere und flexiblere Möglichkeiten für Dateioperationen.
Methodenüberladung
Files.copy()Die Methode hat drei hauptsächliche überladene Formen:
Kopieren vom Eingabestream in eine Datei
public static long copy(InputStream in, Path target, CopyOption... options) throws IOException
Kopieren von einer Datei in einen Ausgabestream
public static long copy(Path source, OutputStream out) throws IOException
Datei-zu-Datei-Kopie
public static Path copy(Path source, Path target, CopyOption... options) throws IOException
Parameterdetails
Eingabeparameter
- InputStream in: Der zu kopierende Eingabestream
- Path source: Der Pfad der Quelldatei
- Path target: Der Pfad der Zieldatei
- OutputStream out: Der Ausgabestream, in den geschrieben wird
- CopyOption... options: Optionale Kopieroptionen
CopyOption-Optionen
Häufig verwendetCopyOptionDazu gehören:
StandardCopyOption.REPLACE_EXISTING: Wenn die Zieldatei bereits existiert, wird sie ersetztStandardCopyOption.COPY_ATTRIBUTES: Dateiattribute in die neue Datei kopierenLinkOption.NOFOLLOW_LINKS: Symbolischen Links nicht folgen
Rückgabewert
- Für Stream-zu-Datei-Kopie: gibt die Anzahl der kopierten Bytes zurück
- Für Datei-zu-Datei-Kopie: gibt den Pfad der Zieldatei zurück
- Für Datei-zu-Stream-Kopie: gibt die Anzahl der kopierten Bytes zurück
Anwendungsbeispiele
Einfache Dateikopie
Beispiel
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Datei erfolgreich kopiert");
} catch (IOException e) {
System.err.println("Kopieren fehlgeschlagen: " + e.getMessage());
}
Path target = Paths.get("target.txt");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Datei erfolgreich kopiert");
} catch (IOException e) {
System.err.println("Kopieren fehlgeschlagen: " + e.getMessage());
}
Dateikopie mit Attributen
Beispiel
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {
Files.copy(source, target,
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
System.out.println("Datei und Attribute erfolgreich kopiert");
} catch (IOException e) {
System.err.println("Kopieren fehlgeschlagen: " + e.getMessage());
}
Path target = Paths.get("target.txt");
try {
Files.copy(source, target,
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
System.out.println("Datei und Attribute erfolgreich kopiert");
} catch (IOException e) {
System.err.println("Kopieren fehlgeschlagen: " + e.getMessage());
}
Kopieren von Eingabestream in Datei
Beispiel
try (InputStream in = new URL("http://example.com/file.txt").openStream()) {
Path target = Paths.get("downloaded.txt");
long bytesCopied = Files.copy(in, target);
System.out.println("Download abgeschlossen, kopiert " + bytesCopied + " bytes");
} catch (IOException e) {
System.err.println("Download fehlgeschlagen: " + e.getMessage());
}
Path target = Paths.get("downloaded.txt");
long bytesCopied = Files.copy(in, target);
System.out.println("Download abgeschlossen, kopiert " + bytesCopied + " bytes");
} catch (IOException e) {
System.err.println("Download fehlgeschlagen: " + e.getMessage());
}
Hinweise
- Verzeichnis kopieren:
Files.copy()Die Methode kopiert Verzeichnisinhalte standardmäßig nicht rekursiv; sie kopiert nur leere Verzeichnisse. - Symbolische Links: Standardmäßig symbolischen Links folgen, sofern nicht anders angegeben
LinkOption.NOFOLLOW_LINKS - Atomarität: Dateikopiervorgänge sind nicht atomar und können während des Vorgangs fehlschlagen
- Leistung: Bei großen Dateien ist die NIO-Kopie im Allgemeinen effizienter als traditionelles IO
- Ausnahmebehandlung: Möglicherweise ausgelöste Ausnahmen müssen behandelt werden
IOException
Vergleich mit traditionellem IO
| Merkmal | NIO Files.copy() | Traditionelles IO (FileInputStream/FileOutputStream) |
|---|---|---|
| Leistung | Höher | Niedriger |
| Funktionsumfang | Umfangreicher | Einfach |
| Ausnahmebehandlung | Prägnanter | Umständlicher |
| Umgang mit symbolischen Links | Unterstützt | Nicht unterstützt |
| Kopieren von Dateiattributen | Unterstützt | Nicht unterstützt |
Best Practices
- Für einfaches Dateikopieren verwenden Sie die grundlegendste
Files.copy()Form - Wenn Dateiattribute beibehalten werden müssen, fügen Sie die
COPY_ATTRIBUTESoption - Wenn Sie eine Zieldatei behandeln, die möglicherweise bereits existiert, verwenden Sie
REPLACE_EXISTING - Erwägen Sie bei großen Dateien die Verwendung von
Files.copy()anstelle traditioneller IO-Methoden - Verwenden Sie immer try-with-resources, um Stream-Ressourcen zu behandeln
Java java.nio.file.Files