Java Datei kopieren ist eine sehr häufige Operation. Aber die java.io.File-Klasse hat keine Shortcut-Methode, um eine Datei von der Quelle zum Ziel zu kopieren. Hier erfahren wir von vier verschiedenen Möglichkeiten, wie wir eine Datei in Java kopieren können.
Java Datei kopieren
- Java Datei kopieren – Stream
Dies ist der herkömmliche Weg, um eine Datei in Java zu kopieren. Hier erstellen wir zwei Dateien – Quelle und Ziel. Dann erstellen wir einen InputStream von der Quelle und schreiben ihn mit OutputStream in die Zieldatei für die Java-Dateikopieroperation. Hier ist die Methode, die für das Kopieren von Dateien in Java mit Streams verwendet werden kann.
private static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
is.close();
os.close();
}
}
- Java Datei kopieren – java.nio.channels.FileChannel
Java NIO-Klassen wurden in Java 1.4 eingeführt und FileChannel kann zum Kopieren von Dateien in Java verwendet werden. Laut der Javadoc-Methode transferFrom() soll diese Methode zum Kopieren von Dateien schneller sein als die Verwendung von Streams für das Kopieren von Dateien in Java. Hier ist die Methode, die zum Kopieren einer Datei mit FileChannel verwendet werden kann.
private static void copyFileUsingChannel(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}finally{
sourceChannel.close();
destChannel.close();
}
}
- Java Datei kopieren – Apache Commons IO FileUtils
Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) kann verwendet werden, um Dateien in Java zu kopieren. Wenn Sie bereits Apache Commons IO in Ihrem Projekt verwenden, macht es Sinn, dies für die Code-Einfachheit zu nutzen. Intern verwendet es Java NIO FileChannel, sodass Sie diese Wrapper-Methode vermeiden können, wenn Sie sie nicht bereits für andere Funktionen verwenden. Hier ist die Methode zur Verwendung von Apache Commons IO für die Java-Kopierdateioperation.
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}
- Java Copy File – Files-Klasse
Wenn Sie an Java 7 oder höher arbeiten, können Sie die Dateien-Klasse copy()-Methode verwenden, um Dateien in Java zu kopieren. Es verwendet Dateisystemanbieter, um die Dateien zu kopieren.
private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
Um herauszufinden, welche Methode die schnellste ist, habe ich eine Testklasse geschrieben und die obigen Methoden nacheinander für das Kopieren von Dateien von 1 GB ausgeführt. Bei jedem Aufruf habe ich unterschiedliche Dateien verwendet, um eventuelle Vorteile für spätere Methoden aufgrund von Zwischenspeicherung zu vermeiden.
package com.journaldev.files;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import org.apache.commons.io.FileUtils;
public class JavaCopyFile {
public static void main(String[] args) throws InterruptedException, IOException {
File source = new File("/Users/pankaj/tmp/source.avi");
File dest = new File("/Users/pankaj/tmp/dest.avi");
//Datei auf herkömmliche Weise mit Stream kopieren
long start = System.nanoTime();
copyFileUsingStream(source, dest);
System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
//Dateien mit java.nio FileChannel kopieren
source = new File("/Users/pankaj/tmp/sourceChannel.avi");
dest = new File("/Users/pankaj/tmp/destChannel.avi");
start = System.nanoTime();
copyFileUsingChannel(source, dest);
System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
//Dateien mit Apache Commons IO kopieren
source = new File("/Users/pankaj/tmp/sourceApache.avi");
dest = new File("/Users/pankaj/tmp/destApache.avi");
start = System.nanoTime();
copyFileUsingApacheCommonsIO(source, dest);
System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
//Verwendung der Java 7 Files-Klasse
source = new File("/Users/pankaj/tmp/sourceJava7.avi");
dest = new File("/Users/pankaj/tmp/destJava7.avi");
start = System.nanoTime();
copyFileUsingJava7Files(source, dest);
System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));
}
}
Hier ist die Ausgabe des obigen Programms. Beachten Sie, dass ich den obigen Code kommentiert habe, um sicherzustellen, dass jedes Mal nur eine Methode für die Java-Dateikopieroperation verwendet wird.
Time taken by Stream Copy = 44582575000
Time taken by Channel Copy = 104138195000
Time taken by Apache Commons IO Copy = 108396714000
Time taken by Java7 Files Copy = 89061578000
Aus der Ausgabe ist klar, dass Stream Copy der beste Weg ist, um eine Datei in Java zu kopieren. Aber es ist ein sehr grundlegender Test. Wenn Sie an einem leistungsintensiven Projekt arbeiten, sollten Sie verschiedene Methoden zum Kopieren von Dateien in Java ausprobieren und die Zeiten notieren, um den besten Ansatz für Ihr Projekt herauszufinden. Sie sollten auch mit verschiedenen Methoden zum Kopieren von Dateien in Java spielen, basierend auf der durchschnittlichen Dateigröße. Ich habe ein YouTube-Video für 4 Möglichkeiten erstellt, eine Datei in Java zu kopieren, das Sie sich ansehen können, um mehr zu erfahren. https://www.youtube.com/watch?v=op6tgG95zek
Source:
https://www.digitalocean.com/community/tutorials/java-copy-file