Java Copia File – 4 Modi per Copiare un File in Java

La copia di file in Java è un’operazione molto comune. Ma la classe java.io.File non ha alcun metodo abbreviato per copiare un file dalla sorgente alla destinazione. Qui impareremo quattro diversi modi in cui possiamo copiare file in java.

Copia File Java

  1. Copia File Java – Stream

Questo è il modo convenzionale di copiare file in java. Qui creiamo due File – sorgente e destinazione. Poi creiamo InputStream dalla sorgente e lo scriviamo nel file di destinazione usando OutputStream per l’operazione di copia file java. Ecco il metodo che può essere utilizzato per copiare un file in java usando gli stream.

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. Copia File Java – java.nio.channels.FileChannel

Le classi Java NIO sono state introdotte in Java 1.4 e FileChannel può essere utilizzato per copiare file in java. Secondo il javadoc del metodo transferFrom(), questo modo di copiare file dovrebbe essere più veloce dell’uso degli Stream per copiare file in java. Ecco il metodo che può essere utilizzato per copiare un file utilizzando 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. Copia File Java – Apache Commons IO FileUtils

Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) può essere utilizzato per copiare file in Java. Se stai già utilizzando Apache Commons IO nel tuo progetto, ha senso utilizzarlo per la semplicità del codice. Internamente utilizza Java NIO FileChannel, quindi puoi evitare questo metodo wrapper se non lo stai già utilizzando per altre funzioni. Ecco il metodo per utilizzare apache commons io per l’operazione di copia file in Java.

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}
  1. Copia file Java – classe Files

Se stai lavorando su Java 7 o versioni successive, puoi utilizzare Files classe copy() metodo per copiare file in Java. Utilizza i provider del sistema di file per copiare i file.

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

Per scoprire qual è il metodo più veloce, ho scritto una classe di test ed eseguito i metodi sopra uno per uno per copiare un file di 1 GB. In ogni chiamata, ho utilizzato file diversi per evitare eventuali vantaggi ai metodi successivi a causa della memorizzazione nella cache.

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

        // copia file in modo convenzionale utilizzando Stream
        long start = System.nanoTime();
        copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
        
        // copia file utilizzando 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));
        
        // copia file utilizzando 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));
        
        // utilizzando Java 7 Files class
        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));        
    }
}

Ecco l’output del programma precedente, nota che ho commentato il codice sopra per assicurarmi che ogni volta venga utilizzato solo un metodo per l’operazione di copia file 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

Dall’output, è chiaro che la copia dello stream è il modo migliore per copiare un file in Java. Ma è un test molto basilare. Se stai lavorando su un progetto intensivo in termini di prestazioni, allora dovresti provare metodi diversi per la copia di file in Java e annotare i tempi per capire il miglior approccio per il tuo progetto. Dovresti anche sperimentare con diversi modi di copiare i file in Java in base alla dimensione media del file. Ho creato un video su YouTube per 4 modi per copiare il file in Java, puoi guardarlo per saperne di più. https://www.youtube.com/watch?v=op6tgG95zek

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