如何从S3下载GZip文件?

时间:2015-07-01 17:46:52

标签: java amazon-web-services amazon-s3 gzip

我查看了AWS S3 Java SDK - Download file helpWorking with Zip and GZip files in Java

虽然它们提供了分别从S3和GZipped文件下载和处理文件的方法,但这些方法无法处理位于S3中的GZipped文件。我该怎么做?

目前我有:

try {
    AmazonS3 s3Client = new AmazonS3Client(
            new ProfileCredentialsProvider());
    String URL = downloadURL.getPrimitiveJavaObject(arg0[0].get());
    S3Object fileObj = s3Client.getObject(getBucket(URL), getFile(URL));
    BufferedReader fileIn = new BufferedReader(new InputStreamReader(
            fileObj.getObjectContent()));
    String fileContent = "";
    String line = fileIn.readLine();
    while (line != null){
        fileContent += line + "\n";
        line = fileIn.readLine();
    }
    fileObj.close();
    return fileContent;
} catch (IOException e) {
    e.printStackTrace();
    return "ERROR IOEXCEPTION";
}

显然,我没有处理文件的压缩特性,我的输出是:

����sU�3204�50�5010�20�24��L,(���O�V�M-.NLOU�R�U�����<s��<#�^�.wߐX�%w���������}C=�%�J3��.�����둚�S�ᜑ���ZQ�T�e��#sr�cdN#瘐:&�
S�BǔJ����P�<��

但是,我无法在上面给出的second question中实现该示例,因为该文件不在本地,需要从S3下载。

我该怎么办?

5 个答案:

答案 0 :(得分:7)

我使用Scanner代替InputStream来解决问题。

扫描程序获取GZIPInputStream并逐行读取解压缩的文件:

fileObj = s3Client.getObject(new GetObjectRequest(oSummary.getBucketName(), oSummary.getKey()));
fileIn = new Scanner(new GZIPInputStream(fileObj.getObjectContent()));

答案 1 :(得分:3)

您必须使用GZIPInputStream来阅读GZIP文件

       AmazonS3 s3Client = new AmazonS3Client(
            new ProfileCredentialsProvider());
    String URL = downloadURL.getPrimitiveJavaObject(arg0[0].get());
    S3Object fileObj = s3Client.getObject(getBucket(URL), getFile(URL));

    byte[] buffer = new byte[1024];
    int n;
    FileOutputStream fileOuputStream = new FileOutputStream("temp.gz");
    BufferedInputStream bufferedInputStream = new BufferedInputStream( new GZIPInputStream(fileObj.getObjectContent()));

    GZIPOutputStream gzipOutputStream = new GZIPOutputStream(fileOuputStream);
    while ((n = bufferedInputStream.read(buffer)) != -1) {
        gzipOutputStream.write(buffer);
    }
    gzipOutputStream.flush();
    gzipOutputStream.close();

请尝试这种方式从S3下载GZip文件。

答案 2 :(得分:0)

尝试一下

<div class=entry>{{entry}}</div>
<div class=reading>{{reading}}</div>

<hr>

<div class=category>{{category}}</div>
<div class=kenkyusha>{{kenkyusha}}</div>
<div class=examples>{{examples}}</div>

<hr>

<div class=kojien>{{kojien}}</div>

答案 3 :(得分:0)

我正在努力使用 SDK 2.x 实现相同的目标。随着 SDK 2 中引入的新理念,在得出解决方案之前,我不得不做一些研究。所以,为了方便使用 SDK 2.0 的人,在这里添加一个代码片段。

    S3Client s3 = S3Client.builder()
            .region(region)
            .build();

    //Using the key, get the object
    GetObjectRequest request = GetObjectRequest.builder().bucket(bucketName).key(key).build();
    //Read the object as input stream
    InputStream inputStream = s3.getObject(request, ResponseTransformer.toBytes()).asInputStream();
    final GZIPInputStream zipInputStream;
    try {
        //Convert it to GZIP stream
        zipInputStream = new GZIPInputStream(inputStream);;
        BufferedReader in = new BufferedReader(new InputStreamReader(zipInputStream));
        String contentStr;
        while ((contentStr = in.readLine()) != null) {
            //Process the contents
            System.out.println(contentStr);
        }
    } catch (IOException e) {
        //Handle the exception
    }

答案 4 :(得分:-1)

我并不是在寻找这个问题,但我确实想通过实际解释为什么已经提供的解决方案有效来提高这个线程的质量。

不,不是因为建议的扫描仪。这是因为通过将fileObj.getObjectContent()包裹在解压缩内容的GZIPInputStream中来对流进行解压缩

删除scanner,但保留GZIPInputStream,事情仍然有效。