将AWS s3文件读入Java代码

将AWS s3文件读入Java代码,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我试图将AWS s3中的一个文件读取到我的java代码中: File file = new File("s3n://mybucket/myfile.txt"); FileInputStream fileInput = new FileInputStream(file); 然后我得到一个错误: java.io.FileNotFoundException:s3n:/mybucket/myfile.txt(无此类文件或目录) 在java.io.FileInputStream.open(本机方

我试图将AWS s3中的一个文件读取到我的java代码中:

  File file = new File("s3n://mybucket/myfile.txt");
  FileInputStream fileInput = new FileInputStream(file);
然后我得到一个错误:

java.io.FileNotFoundException:s3n:/mybucket/myfile.txt(无此类文件或目录) 在java.io.FileInputStream.open(本机方法) 位于java.io.FileInputStream。(FileInputStream.java:146)



有没有办法从AWS s3打开/读取文件?非常感谢

来自Java的“File”类不理解S3的存在:


2019年,有一种更好的方式从S3读取文件:

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();
    }
}
private final AmazonS3 amazonS3Client=AmazonS3ClientBuilder.standard().build();
私有集合loadFileFromS3(){
try(最终的S3Object S3Object=amazonS3Client.getObject(BUCKET\u名称,
文件名);
final InputStreamReader streamReader=新的InputStreamReader(s3Object.getObjectContent(),StandardCharsets.UTF_8);
最终BufferedReader读取器=新BufferedReader(streamReader)){
返回reader.lines().collect(Collectors.toSet());
}捕获(最终IOE例外){
log.error(e.getMessage(),e)
返回集合;
}
}

如果文件内容是字符串,则可以使用。否则,可以使用on
getObjectContent()
将文件内容读入字节数组

显然,它们最好用于小型对象,这些对象很容易放入内存

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);
    }
}

在java中读取S3文件的步骤可以是:

  • 创建AmazonS3Client
  • 使用bucket名称和键创建S3Object
  • 使用S3Object创建缓冲区读取器并逐行读取文件
  • 1>>>

    2>>>

    3>>>


    谢谢。

    这是我的解决方案。我使用的是SpringBoot2.4.3

    创建一个亚马逊s3客户端

    AmazonS3 amazonS3Client = AmazonS3ClientBuilder
                    .standard()
                    .withRegion("your-region")
                    .withCredentials(
                            new AWSStaticCredentialsProvider(
                                new BasicAWSCredentials("your-access-key", "your-secret-access-key")))
                    .build();
    
    // 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();  
    
    
    创建一个亚马逊传输客户端

    TransferManager transferManagerClient = TransferManagerBuilder.standard()
                    .withS3Client(amazonS3Client)
                    .build();
    
    /tmp/{your-s3-key}中创建一个临时文件,以便我们可以将下载的文件放入该文件中

    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
    
    然后,我们使用transfer manager客户端从s3下载文件

    AmazonS3 amazonS3Client = AmazonS3ClientBuilder
                    .standard()
                    .withRegion("your-region")
                    .withCredentials(
                            new AWSStaticCredentialsProvider(
                                new BasicAWSCredentials("your-access-key", "your-secret-access-key")))
                    .build();
    
    // 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();  
    
    
    现在,s3文件已成功传输到我们创建的临时文件中。我们可以获取临时文件的输入流

    因为临时文件不再需要了,我们只是删除它

    file.delete();
    

    我们也可以使用
    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));
    
    //假设凭据是从环境变量读取的,所以这里没有硬编码
    S3Client=S3Client.builder()
    .地区(地区当选)
    .build();
    GetObjectRequest GetObjectRequest=GetObjectRequest.builder()
    .bucket(bucketName)
    .key(文件名)
    .build();
    ResponseInputStream ResponseInputStream=client.getObject(getObjectRequest);
    InputStream=新建ByteArrayInputStream(responseInputStream.readAllBytes());
    System.out.println(“内容:+新字符串(responseInputStream.readAllBytes(),StandardCharsets.UTF_8));
    
    谢谢!maven中是否有我可以使用的对应jar(用于这些类)。还有。@tedder42,如果对象内容是电子邮件,是否有任何API来处理数据。我想获取电子邮件内容,从,到etc@edwiser作为新问题提问并将其链接到此处-需要更多信息。似乎它已被弃用,请使用
    AmazonS3 s3Client=AmazonS3ClientBuilder.standard().build()
    Optimal以何种方式(很好澄清)?。这会把所有东西都放到内存中,而不使用流语义(如果你有小文件就好,如果你有100GB文件就坏)。嘿,蓝天,你能解释一下这段代码在做什么吗?@bsheps我刚刚编辑了我的答案,怎么样?
    InputStream input = new DataInputStream(new FileInputStream(file));
    
    file.delete();
    
     //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));