Java Bestand Kopiëren – 4 Manieren om een Bestand te Kopiëren in Java

Java-bestand kopiëren is een zeer gebruikelijke bewerking. Maar de klasse java.io.File heeft geen snelkoppelingmethode om een bestand van de bron naar de bestemming te kopiëren. Hier zullen we vier verschillende manieren leren om een bestand in Java te kopiëren.

Java Bestand Kopiëren

  1. Java Bestand Kopiëren – Stream

Dit is de conventionele manier van bestandskopiëren in Java. Hier maken we twee bestanden – bron en bestemming. Vervolgens maken we een InputStream van de bron en schrijven het naar het bestemmingsbestand met behulp van OutputStream voor het kopiëren van bestanden in Java. Hier is de methode die kan worden gebruikt voor het kopiëren van bestanden in Java met behulp van streams.

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();
    }
}
  1. Java Bestand Kopiëren – java.nio.channels.FileChannel

Java NIO-klassen werden geïntroduceerd in Java 1.4 en FileChannel kan worden gebruikt om een bestand in Java te kopiëren. Volgens de javadoc van de methode transferFrom() zou deze manier van bestandskopiëren sneller moeten zijn dan het gebruik van streams voor het kopiëren van bestanden in Java. Hier is de methode die kan worden gebruikt om een bestand te kopiëren met behulp van FileChannel.

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();
   }
}
  1. Java Bestand Kopiëren – Apache Commons IO FileUtils

Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) kan worden gebruikt om bestanden te kopiëren in Java. Als je al Apache Commons IO in je project gebruikt, is het logisch om dit te gebruiken voor eenvoudige code. Intern gebruikt het Java NIO FileChannel, dus je kunt deze wrapper-methode vermijden als je het niet al gebruikt voor andere functies. Hier is de methode voor het gebruik van Apache Commons IO voor het kopiëren van bestanden in Java.

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}
  1. Java Bestand Kopiëren – Files klasse

Als je aan Java 7 of hoger werkt, kun je de Files klasse copy() methode gebruiken om bestanden te kopiëren in Java. Het maakt gebruik van File System-providers om de bestanden te kopiëren.

private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

Om erachter te komen welke methode het snelst is, heb ik een testklasse geschreven en de bovenstaande methoden één voor één uitgevoerd voor het kopiëren van een bestand van 1 GB. Bij elke oproep gebruikte ik verschillende bestanden om enig voordeel voor latere methoden te voorkomen vanwege caching.

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");

        // bestand op de conventionele manier kopiëren met Stream
        long start = System.nanoTime();
        copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
        
        // bestanden kopiëren met java.nio FileChannel
        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));
        
        // bestanden kopiëren met apache commons io
        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));
        
        //gebruik van 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 is de uitvoer van het bovenstaande programma, let op dat ik de bovenstaande code heb uitgeschakeld om ervoor te zorgen dat elke keer slechts één methode wordt gebruikt voor het kopiëren van bestanden in Java.

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

Uit de output is duidelijk dat Stream Copy de beste manier is om een bestand in Java te kopiëren. Maar het is een zeer eenvoudige test. Als je aan een prestatie-intensief project werkt, zou je verschillende methoden moeten uitproberen voor het kopiëren van bestanden in Java en de timings moeten noteren om de beste aanpak voor jouw project te bepalen. Je zou ook moeten experimenteren met verschillende manieren om bestanden in Java te kopiëren op basis van de gemiddelde bestandsgrootte. Ik heb een YouTube-video gemaakt over 4 manieren om een bestand in Java te kopiëren, je kunt deze bekijken om meer te leren. https://www.youtube.com/watch?v=op6tgG95zek

Source:
https://www.digitalocean.com/community/tutorials/java-copy-file