Cela m'a toujours dérangé que la seule façon de copier un fichier en Java consiste à ouvrir des flux, à déclarer un tampon, à lire un fichier, à le parcourir et à l'écrire sur l'autre vapeur. Le Web est jonché d'implémentations similaires, mais encore légèrement différentes de ce type de solution.
Existe-t-il un meilleur moyen de rester dans les limites du langage Java (ce qui ne signifie pas d'exécuter des commandes spécifiques au système d'exploitation)? Peut-être que dans un paquet utilitaire open source fiable, cela masquerait au moins cette implémentation sous-jacente et fournirait une solution en une seule ligne?
Réponses:
Comme le mentionne la boîte à outils ci-dessus, Apache Commons IO est la voie à suivre, en particulier FileUtils . copyFile () ; il gère pour vous tous les travaux lourds.
Et en tant que post-scriptum, notez que les versions récentes de FileUtils (telles que la version 2.0.1) ont ajouté l'utilisation de NIO pour copier des fichiers; NIO peut augmenter considérablement les performances de copie de fichiers , en grande partie parce que les routines NIO reportent la copie directement sur le système d'exploitation / fichier plutôt que de la gérer en lisant et en écrivant des octets via la couche Java. Donc, si vous recherchez des performances, il peut être utile de vérifier que vous utilisez une version récente de FileUtils.
la source
J'éviterais l'utilisation d'un méga api comme apache commons. Il s'agit d'une opération simpliste et intégrée au JDK dans le nouveau package NIO. C'était déjà un peu lié dans une réponse précédente, mais la méthode clé dans l'API NIO sont les nouvelles fonctions "transferTo" et "transferFrom".
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)
L'un des articles liés montre un excellent moyen d'intégrer cette fonction dans votre code, en utilisant le transferFrom:
Apprendre NIO peut être un peu délicat, donc vous voudrez peut-être simplement faire confiance à ce mécanicien avant de partir et d'essayer d'apprendre NIO du jour au lendemain. Par expérience personnelle, il peut être très difficile d'apprendre si vous n'avez pas l'expérience et que vous avez été initié à IO via les flux java.io.
la source
Désormais, avec Java 7, vous pouvez utiliser la syntaxe try-with-resource suivante:
Ou, mieux encore, cela peut également être accompli en utilisant la nouvelle classe Files introduite dans Java 7:
Assez chic, hein?
la source
La classe d'utilité
Copie d'un répertoire ou d'un fichier
Déplacer un répertoire ou un fichier
Copie récursive d'un répertoire ou d'un fichier
la source
En Java 7, c'est facile ...
la source
Pour copier un fichier et l'enregistrer sur votre chemin de destination, vous pouvez utiliser la méthode ci-dessous.
la source
Notez que tous ces mécanismes copient uniquement le contenu du fichier, pas les métadonnées telles que les autorisations. Donc, si vous deviez copier ou déplacer un fichier .sh exécutable sur Linux, le nouveau fichier ne serait pas exécutable.
Pour vraiment copier ou déplacer un fichier, c'est-à-dire pour obtenir le même résultat que la copie à partir d'une ligne de commande, vous devez en fait utiliser un outil natif. Soit un script shell ou JNI.
Apparemment, cela pourrait être corrigé dans java 7 - http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html . Doigts croisés!
la source
La bibliothèque Guava de Google a également une méthode de copie :
Avertissement: si
to
représente un fichier existant, ce fichier sera remplacé par le contenu defrom
. Sito
etfrom
faites référence au même fichier, le contenu de ce fichier sera supprimé.Paramètres:
from
- le fichier sourceto
- le fichier de destinationLance:
IOException
- si une erreur d'E / S se produitIllegalArgumentException
- sifrom.equals(to)
la source
Disponible en standard dans Java 7, path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ tutoriel / essentiel / io / copy.html
Je ne peux pas croire qu'il leur ait fallu si longtemps pour normaliser quelque chose d'aussi commun et simple que la copie de fichiers :(
la source
Trois problèmes possibles avec le code ci-dessus:
C'est pourquoi
org.apache.tools.ant.util.ResourceUtils.copyResource
c'est si compliqué. Notez également que tandis que transferFrom est OK, transferTo se casse sur JDK 1.4 sous Linux (voir ID de bogue: 5056395 ) - Jesse Glick Janla source
Si vous êtes dans une application Web qui utilise déjà Spring et si vous ne souhaitez pas inclure Apache Commons IO pour la simple copie de fichiers, vous pouvez utiliser FileCopyUtils du framework Spring.
la source
Voici trois façons de copier facilement des fichiers avec une seule ligne de code!
Java7 :
java.nio.file.Files # copy
Appache Commons IO :
FileUtils # copyFile
Goyave :
Fichiers # copie
la source
Files.copy
est à l' aide de seulement deux paramètresPath
àStream
. Il suffit d' ajouter le paramètreStandardCopyOption.COPY_ATTRIBUTES
ouStandardCopyOption.REPLACE_EXISTING
pourPath
àPath
la source
La copie NIO avec un tampon est la plus rapide selon mon test. Voir le code de travail ci-dessous d'un de mes projets de test à https://github.com/mhisoft/fastcopy
}
la source
Rapide et fonctionne avec toutes les versions de Java également Android:
la source
Un peu tard pour la fête, mais voici une comparaison du temps nécessaire pour copier un fichier en utilisant différentes méthodes de copie de fichier. J'ai parcouru les méthodes 10 fois et j'ai pris une moyenne. Le transfert de fichiers à l'aide de flux d'E / S semble être le pire candidat:
Voici les méthodes:
Le seul inconvénient que je peux voir lors de l'utilisation de la classe de canal NIO est que je n'arrive toujours pas à trouver un moyen d'afficher la progression de la copie de fichiers intermédiaires.
la source