Déplacer / copier les opérations de fichiers en Java

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

70
demandé sur Jonik 2008-11-19 02:34:39

7 réponses

Voici comment faire 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();
        }
    }
}
71
répondu Rigo Vides 2012-04-30 16:35:13

pas encore, mais le Nouveau NIO (JSR 203) aura l'appui pour ces opérations communes.

Dans l'intervalle, il ya quelques choses à garder à l'esprit.

"151970920 de Fichier".renameTo ne fonctionne généralement que sur le même volume de système de fichiers. Je pense que c'est l'équivalent d'une commande "mv". Utilisez-le si vous le pouvez, mais pour la copie générale et le soutien de déplacement, vous aurez besoin d'avoir un repli.

Lorsqu'un renommage ne fonctionne pas, vous devrez copier le fichier (en supprimant l'original avec le fichier ).supprimer si c'est une opération de" déplacement"). Pour ce faire avec la plus grande efficacité, utilisez le FileChannel.transferTo ou FileChannel.transfert des méthodes . 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 d'un noyau à l'autre. espace utilisateur, donnant un grand coup de pouce à l'efficacité.

40
répondu erickson 2008-11-18 23:43:13

Check out: http://commons.apache.org/io/

il a copie, et comme indiqué le JDK a déjà mouvement.

N'utilisez pas votre propre méthode de copie. Il ya tellement de nombreux flottant là-bas...

17
répondu Pyrolistical 2008-11-18 23:59:35

les réponses précédentes semblent périmées.

fichier Java .renameTo () est probablement la solution la plus facile pour API 7, et semble fonctionner très bien. Attention, il ne lance pas D'EXCEPTIONS, mais renvoie true / false!!!

notez qu'il semble y avoir des problèmes avec elle dans les versions précédentes (même que NIO ).

si vous avez besoin d'utiliser une version précédente, cochez 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
répondu ntg 2017-05-23 12:16:57
8
répondu Andrew McKinlay 2010-07-05 16:14:13

Essayez d'utiliser org.apache.commons.io.FileUtils (fichier Général utilitaires de manipulation). Les installations sont fournies selon les méthodes suivantes:

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

(2) FileUtils.moveDirectoryToDirectory (fichier src, fichier destDir, booléen createDestDir) = > déplace un répertoire vers un autre répertoire.

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

(4) FileUtils.moveFileToDirectory (fichier srcFile, fichier destDir, booléen createDestDir) = > déplace un fichier vers un répertoire.

(5) FileUtils.moveToDirectory (fichier src, fichier destDir, booléen createDestDir) = > déplace un fichier ou un répertoire destination répertoire.

C'est simple, facile et rapide.

7
répondu Dellanio 2013-10-21 20:24:51

observation intéressante: Essayé de copier le même fichier via différentes classes java et le temps imprimé en nano secondes.

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

Duration using BufferedOutputStream: 1 237 206

la Durée de l'aide (caractères de texte Reader: 2 858 875

Durée à l'aide BufferedReader(Tampon de caractères flux de texte: 1 998 005

durée en utilisant (Dossiers copie NIO): 18 351 115

lorsque vous utilisez L'option Copier des fichiers Nio, cela prend presque 18 fois plus de temps!!! 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
répondu Elena 2017-01-09 09:43:44