从Google云端存储中读取对象始终返回null

时间:2015-02-06 07:02:48

标签: google-app-engine google-cloud-storage

我希望通过GAE向GCS读取/写入blob。但是,我面临一个非常奇怪的问题:

我使用以下方法将对象(HashMap)写入GCS:

GcsOutputChannel outputChannel =
      gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());

  ObjectOutputStream oout =
      new ObjectOutputStream(Channels.newOutputStream(outputChannel));
  oout.writeObject(content);
  oout.close();

现在当我尝试读取同一个对象时,它总是返回null!

GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel(fileName, 0, BUFFER_SIZE);
  ObjectInputStream oin = new ObjectInputStream(Channels.newInputStream(readChannel));
  Object obj = oin.readObject();
  System.out.println("obj is " + obj); //this obj is null!!

我还可以看到使用GCS浏览器创建的对象并查看时间戳并且它有一些大小。 在阅读之前,我可以获得该对象的元数据,它返回正常并且具有正确的长度!只是那个" readObject"返回null! 尝试了其他对象序列化方法但无济于事。

有趣的是,我能够将String作为byte []写入存储桶并将其读回,没有任何问题。因此,不要认为存在与权限/配置相关的任何问题。

这种情况发生在localhost和生产中。

GAE Java 1.9.17 GCS appengine-gcs-client-0.4.4.jar 谷歌-API服务存储-V1-rev26-1.19.1.jar

有人知道会出现什么问题吗?

谢谢,Asim

1 个答案:

答案 0 :(得分:2)

您还需要通过调用outputChannel.waitForOutstandingWrites()来刷新您对GCS的写入内容,例如:

GcsOutputChannel outputChannel =
  gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());

ObjectOutputStream oout =
  new ObjectOutputStream(Channels.newOutputStream(outputChannel));
oout.writeObject(content);
outputChannel.waitForOutstandingWrites()