谷歌云存储使用java api下载大于块大小的文件时,ZLIB输入流意外结束

And*_*reP 5 java google-cloud-storage

我正在尝试从 Play 商店下载评论,这些评论可以使用 java api 在存储桶中访问(消息末尾的详细信息)。对于压缩时大于块大小的审查文件,我收到以下异常:

java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:116)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at com.google.api.client.util.ByteStreams.copy(ByteStreams.java:51)
at com.google.api.client.util.IOUtils.copy(IOUtils.java:94)
at com.google.api.client.util.IOUtils.copy(IOUtils.java:63)
at com.google.api.client.googleapis.media.MediaHttpDownloader.executeCurrentRequest(MediaHttpDownloader.java:247)
at com.google.api.client.googleapis.media.MediaHttpDownloader.download(MediaHttpDownloader.java:199)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeMediaAndDownloadTo(AbstractGoogleClientRequest.java:553)
at com.google.api.services.storage.Storage$Objects$Get.executeMediaAndDownloadTo(Storage.java:4540)
at com.google.api.services.storage.Storage$Objects$Get$executeMediaAndDownloadTo.call(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码是:

private void saveObject(StorageObject object) {
    try {
        System.out.println("Getting object data");
        FileOutputStream fos = new FileOutputStream (new File(object.getName()));

        Storage.Objects.Get getObject =
            storage.objects().get("pubsite_prod_rev_XXXXX", object.getName());

        // setting the chunksize to a small value fails pretty much on all files
        getObject.getMediaHttpDownloader().setDirectDownloadEnabled(false).setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)

        // setting the chunksize to larger value allows me to download some of the files but fails on larger ones
        //getObject.getMediaHttpDownloader().setDirectDownloadEnabled(false).setChunkSize(MediaHttpDownloader.MAXIMUM_CHUNK_SIZE)


        getObject.executeMediaAndDownloadTo(fos);
        fos.close();
    } catch(Exception e) {
        System.err.println("Error downloading " + object.getName());
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我可以使用 gsutil 下载文件,因此 MediaHttpDownloader 中的分块实现似乎是一个问题。

我正在使用 java 7 和以下库

compile group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0'
compile group: 'com.google.oauth-client', name: 'google-oauth-client-jetty', version: '1.19.0'
compile group: 'com.google.apis', name: 'google-api-services-storage', version: 'v1beta2-rev56-1.19.0'
Run Code Online (Sandbox Code Playgroud)

此外,我正在使用 groovy,但不知道这会如何影响问题,因为错误在 google lib 内部。

谢谢你的帮助

安德烈