Qual è il modo più veloce per scrivere un oggetto S3 (di cui ho la chiave) in un file? Sto usando Java.Come scrivere un oggetto S3 in un file?
risposta
Mentre IOUtils.copy()
e IOUtils.copyLarge()
sono grandi, io preferirei la via vecchia scuola di loop attraverso l'InputStream fino InputStream restituisce -1. Perché? Ho usato IOUtils.copy() prima, ma c'era un caso d'uso specifico in cui, se ho iniziato a scaricare un file di grandi dimensioni da S3 e poi per qualche motivo se quel thread è stato interrotto, il download non si fermava e continuava fino al l'intero file è stato scaricato.
Naturalmente, questo non ha nulla a che fare con S3, solo la libreria IOUtils.
Quindi, preferisco questo:
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: Questo significa anche che non è necessario librerie aggiuntive
classe L'AmazonS3Client ha il seguente metodo:
S3Object getObject(String bucketName, String key)
Il S3Object tornato ha il metodo ...
java.io.InputStream getObjectContent()
..che ottiene il contenuto oggetto come un flusso. Userei IOUtils da Apache Commons come questo:
IOUtils.copy(s3Object.getObjectContent(), new FileOutputStream(new File(filepath)));
cosa devo fare se il file è compresso con gzip? –
Dal Java 7 (pubblicato a luglio 2011), c'è un modo migliore : Files.copy()
utilità da java.util.nio.file
.
Copia tutti i byte da un flusso di input a un file.
quindi è necessario néan external library né posizionare il proprio byte array loops. Di seguito sono riportati due esempi, entrambi utilizzano il flusso di input da S3Object.getObjectContent()
.
InputStream in = s3Client.getObject("bucketName", "key").getObjectContent();
1) Scrivi un nuovo file al percorso specificato:
Files.copy(in, Paths.get("/my/path/file.jpg"));
2) scrivere in un file temporaneo nella posizione predefinita tmp del sistema:
File tmp = File.createTempFile("s3test", "");
Files.copy(in, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
(Senza specificare l'opzione per sostituire il file esistente, riceverai un FileAlreadyExistsException
.)
Si noti inoltre che getObjectContent()
Javadocs vi esorto a chiudere il flusso di input:
Se si recupera un S3Object, si dovrebbe chiudere questo flusso di input come più presto possibile, perché i contenuti degli oggetti non verranno inseriti nella memoria e streaming direttamente da Amazon S3. Inoltre, la mancata chiusura dello stream può causare il blocco del pool di richieste.
Così dovrebbe essere più sicuro di avvolgere tutto in try-catch-finally, e fare in.close();
nel blocco finally.
Quanto sopra presuppone che si usi l'SDK ufficiale da Amazon (aws-java-sdk-s3
).
Che dire di questo uno di linea utilizzando un TransferManager:
TransferManagerBuilder.defaultTransferManager
.download("bucket-name", "key", new File("."))
- 1. Come scrivere un oggetto semplice in PHP
- 2. Come scrivere su un oggetto risposta HttpServletResponse?
- 3. Come caricare un oggetto in S3 in Lambda?
- 4. Come scrivere in un file in PHP?
- 5. Come scrivere un nidificato multidimensionale oggetto JSON
- 6. Come scrivere in sicurezza su un file?
- 7. Come guardare un file scrivere in PHP?
- 8. Come scrivere ArrayList in un file csv
- 9. FFmpeg Come scrivere video in un file
- 10. OCaml Come scrivere in un file?
- 11. Come scrivere un file Json in C#?
- 12. Python come scrivere in un file binario?
- 13. Come scrivere interi in un file
- 14. Come scrivere su un file in Kotlin?
- 15. scrivere un XSSFWorkbook in un file zip
- 16. Come posso scrivere un controller senza renderlo un oggetto God?
- 17. Come leggere il contenuto di un file in Amazon S3
- 18. Come salvare un oggetto QPixmap in un file?
- 19. s3 per oggetto scadenza
- 20. Come scrivere un file da un ArrayBuffer in JS
- 21. scrivere in un file in Perl
- 22. Come scrivere un linker
- 23. Come creare un oggetto S3 in un bucket con una chiamata di nebbia?
- 24. Scrivere in un file CSV in Node.js
- 25. Scrivere dati R come csv direttamente su s3
- 26. Come scrivere dati in un file JSON utilizzando Javascript
- 27. Come scrivere un UT per prendere in giro un oggetto interno in un metodo?
- 28. Come salvare l'oggetto S3 in un file utilizzando boto3
- 29. Come scrivere un flusso su file?
- 30. Come scrivere un file funzionale "scanner"
Cosa devo fare se il file è gzip? –
Genera eccezione indice OOB. –
O semplicemente 'Files.copy (in, Paths.get ("/mio/percorso/file.jpg "))' come @Jonik ha risposto – Joan