从 Google Cloud Storage 读取对象总是 returns null

Reading object from Google Cloud Storage always returns null

我希望通过 GAE read/write 一个 blob 到 GCS。但是,我面临一个非常奇怪的问题:

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

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

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

现在,当我尝试读取同一个对象时,它总是 returns 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 浏览器创建的对象和时间戳,并且它有一定的大小。 在阅读之前,我可以获得该对象的元数据并且它 returns 很好并且长度也正确!就是"readObject" returns null! 尝试了其他对象序列化方法,但无济于事。

有趣的是,我能够将 String 作为 byte[] 写入存储桶并毫无问题地读回。所以不要认为 permission/configuration.

有任何问题

这在本地主机和生产环境中都会发生。

GAE Java 1.9.17 GCS appengine-gcs-client-0.4.4.jar google-api-services-storage-v1-rev26-1.19.1.jar

有人知道哪里出了问题吗?

谢谢,阿西姆

您还需要通过调用 outputChannel.waitForOutstandingWrites() 将您的写入刷新到 GCS,例如:

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

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