如何在AWS S3存储桶中使用Java读取压缩的CSV文件?

如何在AWS S3存储桶中使用Java读取压缩的CSV文件?,java,csv,amazon-web-services,amazon-s3,Java,Csv,Amazon Web Services,Amazon S3,我需要从S3存储桶中读取.csv文件。我成功了 S3Object s3Obj = amazonS3Client.getObject(bucketname, fileName); BufferedReader reader = new BufferedReader(new InputStreamReader(s3Obj.getObjectContent())); 现在,相同的.csv文件以存档(压缩)形式出现在AWS S3 bucket中。我需要在服务器端读取此.csv文件,而无需解压缩操作

我需要从S3存储桶中读取
.csv
文件。我成功了

S3Object s3Obj = amazonS3Client.getObject(bucketname, fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(s3Obj.getObjectContent())); 
现在,相同的
.csv
文件以存档(压缩)形式出现在AWS S3 bucket中。我需要在服务器端读取此
.csv
文件,而无需解压缩操作


AWS中是否有任何文档或API可以直接读取
.csv
文件而无需解压缩?

如果在您的示例中
s3Obj.getObjectContent()
返回压缩文件流,则类似的操作应该可以访问它

ZipInputStream in = new ZipInputStream(s3Obj.getObjectContent());
while ((entry = in.getNextEntry()) != null) {
    System.out.printf("entry: %s%n", entry.getName());
}
in.close();

您可以通过以下步骤直接从Amazon S3读取压缩的CSV文件:

  • 从S3获取对象
  • 使用对象的数据创建ZipInputStream
  • 使用ZipInputStream创建读取器
  • 例如:

    AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();  
    S3Object object = s3Client.getObject("mybucket","myfile.csv.zip");  
    ZipInputStream in = new ZipInputStream(object.getObjectContent());  
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));  
    
    因为zip文件可以包含许多文件,所以需要将ZipInputStream定位在每个ZipEntry的开头,以分别读取包含的每个文件。(即使zip文件中只包含一个文件,您也需要执行一次操作,以将ZipInputStream放在单独ZipEntry的开头。)


    你可以用a来读它。Thanx表示回应。ZipInputStream需要InputsReal对象。但是有s3Object,javadoc后面是InputStream的一个子类。所以你至少可以试试。如果失败,您可以在此处发布错误消息。;-)这里我们的S3对象是压缩文件,其中压缩了CSV文件。我们可以在s3Object上调用的方法是getObjectContent(),用于读取数据流。但是,如果我直接在s3Object上调用getObjectContent(),它会提供非预期数据。如果您正在查找csv文件的内容,如何继续?@NourdineAlouane读取ZIP文件中的条目通常
    OutputStream out=new FileOutputStream(entry.getName())
    会让您访问该流。entry.getName()不起作用,如果您有一个包含“test.csv”的文件“test.zip”,ended entry.getName()将以字符串形式返回“test.csv”。但是,输入流名称与“test.csv”有所不同,通常类似于“fre4df9hg6f23s5kg6f3s9dhg.csv”。这段代码对我来说很有用,但它可以访问第一个GZIP条目:
    BufferedReader in=new BufferedReader(new-InputStreamReader(new-GZIPInputStream)(new-FileInputStream(“您的GZIP文件”));字符串内容;而((content=in.readLine())!=null){System.out.println(content);}
    @NourdineAlouane我不使用Amazons S3服务。一切都是基于OP提供的信息。我对S3Object结构一无所知。也许你应该从这一点开始。工作完美,应该是公认的答案,谢谢!
    String line;
    while (in.getNextEntry() != null) { // loop through each file within the zip
        while ((line = reader.readLine()) != null) { // loop through each line
            System.out.println(line);
        }
    }