我正在尝试使用以下代码将文件写入Google云端存储(GCS)。
AppIdentityService appIdentityService = AppIdentityServiceFactory.getAppIdentityService();
Stirng defaultBucketName = appIdentityService.getDefaultGcsBucketName();
String fileName = "MyGcsFile-1.json";
String mimeType = "application/json";
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename file = new GcsFilename(defaultBucketName, fileName);
GcsFileOptions.Builder builder = new GcsFileOptions.Builder();
GcsFileOptions options = builder.mimeType(mimeType).build();
GcsOutputChannel channel = gcsService.createOrReplace(file, options);
PrintWriter writer = new PrintWriter(Channels.newWriter(channel, "UTF8"));
writer.print(fileContent);
writer.close();
channel.close();
但是当我尝试使用代码从GCS获取文件时:
AppIdentityService appIdentityService = AppIdentityServiceFactory.getAppIdentityService();
Stirng defaultBucketName = appIdentityService.getDefaultGcsBucketName();
String fileName = "MyGcsFile-1.json";
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename gcsFile = new GcsFilename(defaultBucketName, fileName);
GcsInputChannel readChannel = gcsService.openReadChannel(gcsFile, new Long(0));
InputStream is = Channels.newInputStream(readChannel);
JsonFactory j = new JsonFactory();
org.codehaus.jackson.JsonParser jp = j.createJsonParser(is);
获取FileNotFoundException
java.io.FileNotFoundException
at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:615)
at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:594)
at com.google.appengine.api.files.FileServiceImpl.read(FileServiceImpl.java:553)
at com.google.appengine.api.files.FileServiceImpl.read(FileServiceImpl.java:431)
at com.google.appengine.api.files.FileReadChannelImpl.read(FileReadChannelImpl.java:84)
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.readObjectAsync(LocalRawGcsService.java:271)
at com.google.appengine.tools.cloudstorage.SimpleGcsInputChannelImpl$1.call(SimpleGcsInputChannelImpl.java:87)
at com.google.appengine.tools.cloudstorage.SimpleGcsInputChannelImpl$1.call(SimpleGcsInputChannelImpl.java:81)
at com.google.appengine.tools.cloudstorage.RetryHelper.doRetry(RetryHelper.java:108)
at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:166)
at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:156)
at com.google.appengine.tools.cloudstorage.SimpleGcsInputChannelImpl.read(SimpleGcsInputChannelImpl.java:81)
at sun.nio.ch.ChannelInputStream.read(Unknown Source)
at sun.nio.ch.ChannelInputStream.read(Unknown Source)
at sun.nio.ch.ChannelInputStream.read(Unknown Source)
at org.codehaus.jackson.impl.ByteSourceBootstrapper.ensureLoaded(ByteSourceBootstrapper.java:507)
at org.codehaus.jackson.impl.ByteSourceBootstrapper.detectEncoding(ByteSourceBootstrapper.java:129)
at org.codehaus.jackson.impl.ByteSourceBootstrapper.constructParser(ByteSourceBootstrapper.java:224)
at org.codehaus.jackson.JsonFactory._createJsonParser(JsonFactory.java:785)
at org.codehaus.jackson.JsonFactory.createJsonParser(JsonFactory.java:561)
上述代码中的问题在哪里?在向GCS写文件?或从GCS读取文件?
答案 0 :(得分:2)
此处我的App Engine是在1.9.0发布之前创建的。这样就没有为我的帐户创建默认存储桶。在这里,我必须手动创建默认存储桶。以下是Google documentation的详细信息:
使用默认GCS存储桶
默认存储桶不需要进一步激活,配置或权限,也不需要注册GCS。水桶就在那里,随时可以免费配额使用。如果您使用此选项,则无需为应用程序计费。
默认存储桶名称通常为< app_id> .appspot.com,您可以在其中替换为您的应用ID。您可以在App Engine管理控制台“应用程序设置”页面的Google Cloud Storage Bucket标签下找到存储桶名称。或者,您可以使用App Identity getDefaultGcsBucketName方法以编程方式查找名称。
答案 1 :(得分:0)
看起来你可能会失踪:
channel.write(ByteBuffer src)
存储文件时。