Java 如何从gcs获取文件列表?

Java 如何从gcs获取文件列表?,java,google-app-engine,google-cloud-storage,Java,Google App Engine,Google Cloud Storage,按照google的,我使用下面的代码来获取远程目录中所有文件的列表 class GCSFileStorage { String bucket = "bucket_name"; String remoteDirectoryPath = "remote/path"; int fetchBlockSize = 1024 * 1024; GcsService gcsService = GcsServiceFactory.createGcsService(Ret

按照google的,我使用下面的代码来获取远程目录中所有文件的列表

class GCSFileStorage {
    String bucket = "bucket_name";
    String remoteDirectoryPath = "remote/path";
    int fetchBlockSize = 1024 * 1024;
    GcsService gcsService =
      GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());

    List<String> list() {
        List<String> filenames = new List();
        ListResult listResult = gcsService.list(bucket, ListOptions.DEFAULT);
        while (listResult.hasNext()) {
            ListItem listItem = listResult.next();
            filenames += listItem.getName();
        }
        return filenames;
    }
}

GCSFileStorage gcs = new GCSFileStorage();
gcs.list();
GCSFileStorage类{
字符串bucket=“bucket\u name”;
字符串remoteDirectoryPath=“remote/path”;
int fetchBlockSize=1024*1024;
GCS服务GCS服务=
GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
列表(){
列表文件名=新列表();
ListResult ListResult=gcsService.list(bucket,ListOptions.DEFAULT);
while(listResult.hasNext()){
ListItem ListItem=listResult.next();
filenames+=listItem.getName();
}
返回文件名;
}
}
GCSFileStorage gcs=新的GCSFileStorage();
gcs.list();
但此代码失败,但有一个例外:

java.io.IOException: com.google.appengine.tools.cloudstorage.RetriesExhaustedException:
...
Caused by: java.io.IOException: java.lang.NullPointerException
...
Caused by: java.lang.NullPointerException
    at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.<init>(LocalRawGcsService.java:123)
    at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.getInstance(LocalRawGcsService.java:184)
java.io.IOException:com.google.appengine.tools.cloudstorage.retriesHaustedexception:
...
原因:java.io.IOException:java.lang.NullPointerException
...
原因:java.lang.NullPointerException
位于com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter。(LocalRawGcsService.java:123)
位于com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.getInstance(LocalRawGcsService.java:184)

我怀疑我应该以某种方式授权gcs,这可能是失败的原因。但是,我还没有找到合适的方法初始化gcs工作所需的所有内容。

如何运行此代码?此GCS客户端特定于App Engine,应通过已部署的应用程序或本地使用AE dev或单元测试(应使用配置AE运行时环境)运行。

正如我所使用的@ozarov所述,它特定于App Engine。它是通过依赖关系添加的

com.google.appengine.tools:appengine-gcs-client:0.5
相反,应该使用。它的依赖性是

com.google.apis:google-api-services-storage:v1-rev44-1.20.0
然后,获取文件列表的代码可能如下所示

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.storage.Storage;
import com.google.api.services.storage.StorageScopes;
import com.google.api.services.storage.model.Objects;
import com.google.api.services.storage.model.StorageObject;
import com.google.common.collect.Lists;

import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.LinkedList;
import java.util.List;


class GCSFileStorage {
    String bucket = "bucket_name";
    String remoteDirectoryPath = "remote/path";
    Storage storage

    public GCSFileStorage() throws GeneralSecurityException, IOException {
        storage = setupStorage();
    }

    List<String> list() throws IOException {
        List<String> allItems = new LinkedList<String>();
        Objects response = storage.objects().list(bucket).
            setPrefix(remoteDirectoryPath).execute();
        for (StorageObject obj: response.getItems()) {
            allItems.add(obj.getName());
        }
        while (response.getNextPageToken() != null) {
            String pageToken = response.getNextPageToken();
            response = storage.objects().list(bucket).
                setPrefix(remoteDirectoryPath).setPageToken(pageToken).execute();
            for (StorageObject obj: response.getItems()) {
                allItems.add(obj.getName());
            }
        }
        return allItems;
    }


    Storage setupStorage() throws GeneralSecurityException, IOException {
        GoogleCredential credential = new GoogleCredential.Builder().
            setTransport(new NetHttpTransport()).
            setJsonFactory(new JacksonFactory()).
            setServiceAccountId("your_account_id").
            setServiceAccountScopes(
                Lists.newArrayList(StorageScopes.DEVSTORAGE_FULL_CONTROL)).
            setServiceAccountPrivateKeyFromP12File(
                new File("/local/path/to/private/key.p12")).
            build();

        return new Storage.
            Builder(new NetHttpTransport(),
                new JacksonFactory(), credential).
            setApplicationName("foo").build();
    }
}
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
导入com.google.api.client.http.javanet.NetHttpTransport;
导入com.google.api.client.json.jackson2.JacksonFactory;
导入com.google.api.services.storage.storage;
导入com.google.api.services.storage.StorageScopes;
导入com.google.api.services.storage.model.Objects;
导入com.google.api.services.storage.model.StorageObject;
导入com.google.common.collect.list;
导入java.io.File;
导入java.io.IOException;
导入java.security.GeneralSecurityException;
导入java.util.LinkedList;
导入java.util.List;
类GCSFileStorage{
字符串bucket=“bucket\u name”;
字符串remoteDirectoryPath=“remote/path”;
贮存
public GCSFileStorage()引发GeneralSecurityException,IOException{
存储=设置存储();
}
List()引发IOException{
List allItems=new LinkedList();
对象响应=storage.Objects().list(bucket)。
setPrefix(remoteDirectoryPath).execute();
对于(StorageObject对象:response.getItems()){
add(obj.getName());
}
while(response.getNextPageToken()!=null){
字符串pageToken=response.getNextPageToken();
响应=storage.objects().list(bucket)。
setPrefix(remoteDirectoryPath).setPageToken(pageToken).execute();
对于(StorageObject对象:response.getItems()){
add(obj.getName());
}
}
返回allItems;
}
Storage setupStorage()引发GeneralSecurityException,IOException{
GoogleCredential credential=新建GoogleCredential.Builder()。
setTransport(新的NetHttpTransport()。
setJsonFactory(新的JacksonFactory())。
setServiceAccountId(“您的帐户id”)。
setServiceAccountScopes(
Lists.newArrayList(StorageScopes.DEVSTORAGE\u FULL\u CONTROL))。
SetServiceAccountPrivateKeyfromP12文件(
新文件(“/local/path/to/private/key.p12”))。
build();
返回新存储。
生成器(新的NetHttpTransport(),
新JacksonFactory(),凭证)。
setApplicationName(“foo”).build();
}
}