Tout IOUtils.copy() et IOUtils.copyLarge() sont grands, je préfère l'ancienne manière d'une boucle dans le inputstream jusqu'à ce que l'inputstream retourne -1. Pourquoi? J'ai utilisé IOUtils.copier() avant, mais il y avait un cas d'utilisation spécifiques où, si j'ai commencé le téléchargement d'un fichier volumineux à partir de S3 et puis, pour une raison si ce thread a été interrompu, le téléchargement ne serait pas arrêter et il serait aller sur et sur jusqu'à ce que le fichier a été téléchargé.
Bien sûr, cela n'a rien à voir avec S3, juste le IOUtils de la bibliothèque.
Donc, je préfère ceci:
InputStream in = s3Object.getObjectContent();byte[] buf =newbyte[1024];OutputStream out =newFileOutputStream(file);while((count = in.read(buf))!=-1){if(Thread.interrupted()){thrownewInterruptedException();}
out.write(buf,0, count);}
out.close();
in.close();
Note: Ceci signifie également que vous n'avez pas besoin de bibliothèques supplémentaires
Que dois-je faire si le fichier est au format gzip? Jette Indice OOB exception. Ou tout simplement ne Files.copy(in, Paths.get("/my/path/file.jpg")) @Jonik répondu
Si vous récupérez un S3Object, vous devez fermer cette entrée stream
dès que possible, parce que l'objet, le contenu n'est pas mis en
mémoire et stream directement depuis Amazon S3. En outre, l'échec de la fermeture
ce flux peut causer la demande de la piscine pour devenir bloqué.
Il devrait donc être plus sûr de tout envelopper dans try-catch-finally, et ne in.close(); dans le bloc finally.
Ci-dessus suppose que vous utilisez le SDK officiel d'Amazon (aws-java-sdk-s3).
C'est une bien meilleure approache que l'ancien mode de bouclage par le biais d'octets. Je préfère faire Files.copy(in, Paths.get("/my/path/file.jpg")). Meilleure pour obtenir le chemin d'accès sans passer par le Fichier juste point de, mis à jour! Si vous n'avez pas besoin d'attraper envisagez de ressources
Tout
IOUtils.copy()
etIOUtils.copyLarge()
sont grands, je préfère l'ancienne manière d'une boucle dans le inputstream jusqu'à ce que l'inputstream retourne -1. Pourquoi? J'ai utilisé IOUtils.copier() avant, mais il y avait un cas d'utilisation spécifiques où, si j'ai commencé le téléchargement d'un fichier volumineux à partir de S3 et puis, pour une raison si ce thread a été interrompu, le téléchargement ne serait pas arrêter et il serait aller sur et sur jusqu'à ce que le fichier a été téléchargé.Bien sûr, cela n'a rien à voir avec S3, juste le IOUtils de la bibliothèque.
Donc, je préfère ceci:
Note: Ceci signifie également que vous n'avez pas besoin de bibliothèques supplémentaires
Jette Indice OOB exception.
Ou tout simplement ne
Files.copy(in, Paths.get("/my/path/file.jpg"))
@Jonik réponduOriginalL'auteur srikfreak
Depuis Java 7 (publié en juillet 2011), il y a une meilleure façon:
Fichiers.copier()
utilitaire dejava.util.nio.fichier
.Si vous avez besoin ni une bibliothèque externe ni rouler votre propre tableau d'octets boucles. Les deux exemples ci-dessous, qui utilisent le flux d'entrée de
S3Object.getObjectContent()
.1) Écrire dans un nouveau fichier au chemin d'accès spécifié:
2) Écrire dans un fichier temporaire dans le système par défaut de tmp emplacement:
(Sans spécifier l'option de remplacer le fichier existant, vous obtiendrez un
FileAlreadyExistsException
.)Également noter que
getObjectContent()
Javadoc vous exhorte à fermer le flux d'entrée:Il devrait donc être plus sûr de tout envelopper dans try-catch-finally, et ne
in.close();
dans le bloc finally.Ci-dessus suppose que vous utilisez le SDK officiel d'Amazon (
aws-java-sdk-s3
).Je préfère faire
Files.copy(in, Paths.get("/my/path/file.jpg"))
. Meilleure pour obtenir le chemin d'accès sans passer par le Fichierjuste point de, mis à jour!
Si vous n'avez pas besoin d'attraper envisagez de ressources
OriginalL'auteur Jonik
La AmazonS3Client de classe a de la méthode suivante:
Le retour de l'S3Object a la méthode...
..qui obtient le contenu de l'objet comme un flux. Je voudrais utiliser IOUtils de Apache Commons comme ceci:
IOUtils.copy(s3Object.getObjectContent(), new FileOutputStream(new File(filepath)));
OriginalL'auteur Jonathan
Qu'un liner à l'aide d'un TransferManager:
OriginalL'auteur Joan