¿Cuál es la forma más rápida de escribir un objeto S3 (del que tengo la clave) en un archivo? Estoy usando Java.Cómo escribir un objeto S3 en un archivo?
Respuesta
Mientras IOUtils.copy()
y IOUtils.copyLarge()
son grandes, yo prefiero la vieja escuela de bucle a través del flujo de entrada hasta que el InputStream devuelve -1. ¿Por qué? Utilicé IOUtils.copy() antes, pero había un caso de uso específico donde si comenzaba a descargar un archivo grande de S3 y luego, por algún motivo, si ese hilo se interrumpía, la descarga no se detenía y seguía y seguía hasta que todo el archivo fue descargado
Por supuesto, esto no tiene nada que ver con S3, solo con la biblioteca IOUtils.
Por lo tanto, prefiero esto:
InputStream in = s3Object.getObjectContent();
byte[] buf = new byte[1024];
OutputStream out = new FileOutputStream(file);
while((count = in.read(buf)) != -1)
{
if(Thread.interrupted())
{
throw new InterruptedException();
}
out.write(buf, 0, count);
}
out.close();
in.close();
Nota: Esto también significa que no es necesario bibliotecas adicionales
clase El AmazonS3Client tiene el siguiente método:
S3Object getObject(String bucketName, String key)
El S3Object devuelto tiene el método ...
java.io.InputStream getObjectContent()
..which obtiene el contenido objeto como una corriente. Que haría uso de Apache Commons IOUtils así:
IOUtils.copy(s3Object.getObjectContent(), new FileOutputStream(new File(filepath)));
lo que debería hacer si se gzipped el archivo? –
Desde Java 7 (publicado en julio de 2011), hay una manera mejor : Files.copy()
utilidad desde java.util.nio.file
.
Copia todos los bytes de un flujo de entrada a un archivo.
por lo que necesita ni an external library ni rodar su propia byte array loops. Dos ejemplos a continuación, que usan el flujo de entrada desde S3Object.getObjectContent()
.
InputStream in = s3Client.getObject("bucketName", "key").getObjectContent();
1) escribir en un archivo nuevo en ruta especificada:
Files.copy(in, Paths.get("/my/path/file.jpg"));
2) escribir en un archivo temporal en la localización tmp por defecto del sistema:
File tmp = File.createTempFile("s3test", "");
Files.copy(in, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
(Sin especificar la opción para reemplazar el archivo existente, obtendrá un FileAlreadyExistsException
).
También tenga en cuenta que getObjectContent()
Javadocs que instan a cerrar el flujo de entrada:
Si recupera un S3Object, debería cerrar este flujo de entrada como pronto como sea posible, ya que el contenido del objeto no se almacenan en memoria y transmitir directamente desde Amazon S3. Además, si no se cierra esta secuencia, puede provocar que se bloquee el grupo de solicitudes.
Por lo tanto, debería ser más seguro envolver todo en try-catch-finally, y hacer in.close();
en el bloque finally.
Lo anterior supone que utiliza el SDK oficial de Amazon (aws-java-sdk-s3
).
¿Qué hay de éste revestimiento utilizando un TransferManager:
TransferManagerBuilder.defaultTransferManager
.download("bucket-name", "key", new File("."))
- 1. guardar un objeto BufferedImage a Amazon S3 como un archivo
- 2. ¿Cómo escribir un flujo en un archivo?
- 3. Escribir en una secuencia como si fuera un archivo, pero realmente escribir en un objeto
- 4. Cómo cambiar los metadatos en un objeto en Amazon S3
- 5. ¿Cómo leer y escribir un HashMap en un archivo?
- 6. cómo escribir en un archivo en emacs
- 7. ¿Cómo escribir en un archivo en PHP?
- 8. Escribir un archivo en iOS
- 9. Ver si existe un objeto en S3 usando PHP
- 10. Cómo escribir valores vectoriales en un archivo
- 11. Cómo escribir cadenas unicode en un archivo?
- 12. ¿Cómo ver un archivo escribir en PHP?
- 13. Cómo escribir números enteros en un archivo
- 14. ¿Podemos escribir una Hashtable en un archivo?
- 15. ¿Escribir NSData en un archivo?
- 16. Paperclip: ¿eliminar un archivo de Amazon S3?
- 17. Cómo guardar un Objeto QPixmap en un archivo?
- 18. ¿Cómo puedo usar niebla para editar un archivo en s3?
- 19. ¿Cómo escribir una cadena en el cubo de Amazon S3?
- 20. ¿Cómo escribir un InputStream potencialmente enorme en un archivo?
- 21. ¿Cómo escribir en un búfer de memoria con un ARCHIVO *?
- 22. ¿Puedo actualizar un objeto existente de Amazon S3?
- 23. Escribir en un archivo en Monotouch
- 24. ¿Cómo crear un objeto S3 en un cubo con una llamada de niebla?
- 25. escribir en un archivo en Perl
- 26. Cómo cargar un archivo en S3 sin crear un archivo local temporal
- 27. ¿Cómo escribir en un objeto de respuesta HttpServletResponse?
- 28. FFmpeg Cómo escribir vídeo a un archivo
- 29. Cómo escribir un archivo funcional "escáner"
- 30. Escribir en un archivo XML en Java
¿Qué debo hacer si el archivo tiene gzip? –
Lanza la excepción OOB de índice. –
O simplemente haga 'Files.copy (en, Paths.get ("/my/path/file.jpg "))' como @Jonik respondió – Joan