Wie kann ich eine AWS S3-Datei mit Java lesen?

Lesezeit: 4 Minuten

Wie kann ich eine AWS S3 Datei mit Java lesen
Edamame

Ich habe versucht, eine Datei von AWS S3 in meinen Java-Code zu lesen:

  File file = new File("s3n://mybucket/myfile.txt");
  FileInputStream fileInput = new FileInputStream(file);

Dann bekam ich einen Fehler:

java.io.FileNotFoundException: s3n:/mybucket/myfile.txt (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)

Gibt es eine Möglichkeit, eine Datei von AWS S3 zu öffnen/lesen? Vielen Dank!

Die Klasse „File“ von Java versteht nicht, dass S3 existiert. Hier ist ein Beispiel für das Lesen einer Datei aus der AWS-Dokumentation:

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());        
S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, key));
InputStream objectData = object.getObjectContent();
// Process the objectData stream.
objectData.close();

  • Danke! Gibt es ein entsprechendes Glas (für diese Klassen) in Maven, das ich verwenden kann?

    – Edamame

    17. Februar 2015 um 19:54 Uhr

  • Ja das aws-Java-SDK. Es gibt auch Installationsanleitung.

    – Heuwender42

    17. Februar 2015 um 20:02 Uhr

  • @tedder42, gibt es eine API zur Verarbeitung der Daten, wenn der Objektinhalt eine E-Mail ist? Ich möchte den E-Mail-Inhalt erhalten, von, an usw

    Benutzer4458270

    3. April 2017 um 11:17 Uhr


  • @edwiser Stellen Sie eine neue Frage und verlinken Sie sie hier – Sie benötigen weitere Informationen.

    – Heuwender42

    3. April 2017 um 19:55 Uhr

  • Scheint veraltet zu sein, Use AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build()

    – binär

    7. März 2018 um 18:44 Uhr


1643329327 27 Andern des Dateninhalts auf einem Objekt Tag in HTML
Enigo

Im Jahr 2019 gibt es eine etwas optimalere Möglichkeit, eine Datei aus S3 zu lesen:

private final AmazonS3 amazonS3Client = AmazonS3ClientBuilder.standard().build();

private Collection<String> loadFileFromS3() {
    try (final S3Object s3Object = amazonS3Client.getObject(BUCKET_NAME,
                                                            FILE_NAME);
        final InputStreamReader streamReader = new InputStreamReader(s3Object.getObjectContent(), StandardCharsets.UTF_8);
        final BufferedReader reader = new BufferedReader(streamReader)) {
        return reader.lines().collect(Collectors.toSet());
    } catch (final IOException e) {
        log.error(e.getMessage(), e)
        return Collections.emptySet();
    }
}

  • Optimal in welcher Weise (gut zu klären)?. Dies führt dazu, dass alles in den Speicher gezogen wird und keine Streaming-Semantik verwendet wird (gut, wenn Sie kleine Dateien haben, schlecht, wenn Sie eine 100-GB-Datei haben).

    – Pragmatischer Programmierer

    23. April 2020 um 18:34 Uhr


Schritte zum Lesen der S3-Datei in Java können sein:

  1. AmazonS3Client erstellen.
  2. Erstellen Sie S3Object mit dem Bucket-Namen und -Schlüssel.
  3. Erstellen Sie einen Pufferleser mit S3Object und lesen Sie die Datei Zeile für Zeile.

1 >>>

    BasicAWSCredentials awsCreds = new BasicAWSCredentials("accessKey", "secretKey");
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
            .withRegion("region_name_here").build();  

2 >>>

   S3Object object = s3Client.getObject(new GetObjectRequest("bucketName", "key"));

3 >>>

   BufferedReader reader = new BufferedReader(new InputStreamReader(object.getObjectContent()));

    String s = null;
    while ((s = reader.readLine()) != null)
    {
        System.out.println(s);
        //your business logic here
    }

Danke.

Können wir auch verwenden software.amazon.awssdk:s3

 //Assuming the credentials are read from Environment Variables, so no hardcoding here

    S3Client client = S3Client.builder()
                        .region(regionSelected)
                        .build();
    
    GetObjectRequest getObjectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(fileName)
                    .build();
    
    ResponseInputStream<GetObjectResponse> responseInputStream = client.getObject(getObjectRequest);

    InputStream stream = new ByteArrayInputStream(responseInputStream.readAllBytes());
    
    
    System.out.println("Content :"+ new String(responseInputStream.readAllBytes(), StandardCharsets.UTF_8));

Wie kann ich eine AWS S3 Datei mit Java lesen
George V. Reilly

Wenn der Inhalt der Datei eine Zeichenfolge ist, können Sie verwenden getObjectAsString. Andernfalls können Sie verwenden IOUtils.toByteArray an getObjectContent() um den Inhalt der Datei in ein Byte-Array einzulesen.

Offensichtlich werden diese am besten für kleine S3-Objekte verwendet, die leicht in den Speicher passen.

private final AmazonS3 amazonS3Client = AmazonS3ClientBuilder.standard().build();

private String loadStringFromS3() {
    try {
        return amazonS3Client.getObjectAsString(BUCKET_NAME, FILE_NAME);
    } catch (final IOException e) {
        log.error(e.getMessage(), e)
        return null;
    }
}

private byte[] loadDataFromS3() {
    try (final S3Object s3Object = amazonS3Client.getObject(BUCKET_NAME, FILE_NAME)) {
        return IOUtils.toByteArray(s3Object.getObjectContent());
    } catch (final IOException e) {
        log.error(e.getMessage(), e)
        return null;
    } finally {
        IOUtils.closeQuietly(object, log);
    }
}

Das ist meine Lösung. Ich verwende Springboot 2.4.3

Erstelle ein amazon s3-client

AmazonS3 amazonS3Client = AmazonS3ClientBuilder
                .standard()
                .withRegion("your-region")
                .withCredentials(
                        new AWSStaticCredentialsProvider(
                            new BasicAWSCredentials("your-access-key", "your-secret-access-key")))
                .build();

Erstelle ein amazon transfer-client.

TransferManager transferManagerClient = TransferManagerBuilder.standard()
                .withS3Client(amazonS3Client)
                .build();

Ein … kreieren temporäre Datei in /tmp/{dein-s3-schlüssel} damit wir die heruntergeladene Datei in diese Datei einfügen können.

File file = new File(System.getProperty("java.io.tmpdir"), "your-s3-key"); 

try {
    file.createNewFile(); // Create temporary file
} catch (IOException e) {
    e.printStackTrace();
}

file.mkdirs();  // Create the directory of the temporary file

Dann laden wir die Datei von s3 mit herunter Transfer-Manager-Client

// Note that in this line the s3 file downloaded has been transferred in to the temporary file that we created
Download download = transferManagerClient.download(
               new GetObjectRequest("your-s3-bucket-name", "your-s3-key"), file); 

// This line blocks the thread until the download is finished
download.waitForCompletion();  

Nachdem die s3-Datei nun erfolgreich in die übertragen wurde temporäre Datei die wir geschaffen haben. Wir können den InputStream der erhalten temporäre Datei.

InputStream input = new DataInputStream(new FileInputStream(file));

Weil die temporäre Datei wird nicht mehr benötigt, wir löschen es einfach.

file.delete();

996370cookie-checkWie kann ich eine AWS S3-Datei mit Java lesen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy