web-dev-qa-db-fra.com

Déplacer / copier des opérations sur les fichiers dans Java

Existe-t-il une bibliothèque standard Java qui gère les opérations de fichiers courantes telles que le déplacement/copie de fichiers/dossiers?

70
MSumulong

Voici comment procéder avec Java.nio opérations:

public static void copyFile(File sourceFile, File destFile) throws IOException {
    if(!destFile.exists()) {
        destFile.createNewFile();
    }

    FileChannel source = null;
    FileChannel destination = null;
    try {
        source = new FileInputStream(sourceFile).getChannel();
        destination = new FileOutputStream(destFile).getChannel();

        // previous code: destination.transferFrom(source, 0, source.size());
        // to avoid infinite loops, should be:
        long count = 0;
        long size = source.size();              
        while((count += destination.transferFrom(source, count, size-count))<size);
    }
    finally {
        if(source != null) {
            source.close();
        }
        if(destination != null) {
            destination.close();
        }
    }
}
72
Rigo Vides

Pas encore, mais le New NIO (JSR 203) prendra en charge ces opérations courantes.

En attendant, il y a quelques points à garder à l'esprit.

File.renameTo ne fonctionne généralement que sur le même volume de système de fichiers. Je pense à cela comme l'équivalent d'une commande "mv". Utilisez-le si vous le pouvez, mais pour une prise en charge générale de la copie et du déplacement, vous aurez besoin d'avoir une solution de rechange.

Lorsqu'un changement de nom ne fonctionne pas, vous devrez réellement copier le fichier (supprimer l'original avec File.delete s'il s'agit d'une opération de "déplacement"). Pour ce faire avec la plus grande efficacité, utilisez les méthodes FileChannel.transferTo ou FileChannel.transferFrom . L'implémentation est spécifique à la plate-forme, mais en général, lors de la copie d'un fichier à un autre, les implémentations évitent de transporter des données dans les deux sens entre le noyau et l'espace utilisateur, ce qui augmente considérablement l'efficacité.

40
erickson

Découvrez: http://commons.Apache.org/io/

Il a une copie, et comme indiqué, le JDK a déjà déménagé.

N'implémentez pas votre propre méthode de copie. Il y en a tellement qui flottent là-bas ...

17
Pyrolistical

Les réponses précédentes semblent obsolètes.

File.renameTo () de Java est probablement la solution la plus simple pour API 7, et semble fonctionner correctement. Attention, IL NE JETTE PAS D'EXCEPTIONS, mais renvoie vrai/faux !!!

Notez qu'il semble y avoir des problèmes avec celui-ci dans les versions précédentes (comme NIO ).

Si vous devez utiliser une version précédente, vérifiez ici .

Here's an example for API7:
        File f1= new File("C:\\Users\\.....\\foo");
        File f2= new File("C:\\Users\\......\\foo.old");
        System.err.println("Result of move:"+f1.renameTo(f2));

Alternativement:

    System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI());
    Path b1=Files.move(f1.toPath(),  f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING ););
    System.err.println("Move: RETURNS:"+b1);
10
ntg

La bibliothèque Google de Goyave a également ces derniers:

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html

8
Andrew McKinlay

Essayez d'utiliser org.Apache.commons.io.FileUtils (Utilitaires généraux de manipulation de fichiers). Les installations sont fournies selon les méthodes suivantes:

(1) FileUtils.moveDirectory (File srcDir, File destDir) => Déplace un répertoire.

(2) FileUtils.moveDirectoryToDirectory (File src, File destDir, boolean createDestDir) => Déplace un répertoire vers un autre répertoire.

(3) FileUtils.moveFile (File srcFile, File destFile) => Déplace un fichier.

(4) FileUtils.moveFileToDirectory (File srcFile, File destDir, boolean createDestDir) => Déplace un fichier vers un répertoire.

(5) FileUtils.moveToDirectory (File src, File destDir, boolean createDestDir) => Déplace un fichier ou un répertoire vers le répertoire de destination.

C'est simple, facile et rapide.

7
Dellanio

Observation intéressante: J'ai essayé de copier le même fichier via diverses classes Java et temps imprimé en nano secondes.

Durée à l'aide du flux d'octets FileOutputStream: 4 965 078

Durée avec BufferedOutputStream: 1 237 206

Durée d'utilisation (lecteur de texte de caractères: 2 858 875

Durée à l'aide de BufferedReader (Flux de texte de caractères mis en mémoire tampon: 1 998 005

Durée d'utilisation (Fichiers copie NIO): 18351115

lors de l'utilisation de l'option de copie de Files Nio, cela a pris près de 18 fois plus longtemps !!! Nio est l'option la plus lente pour copier des fichiers et BufferedOutputStream ressemble à la plus rapide. J'ai utilisé le même fichier texte simple pour chaque classe.

0
Elena