我希望通过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
答案 0 :(得分:2)
您还需要通过调用outputChannel.waitForOutstandingWrites()
来刷新您对GCS的写入内容,例如:
GcsOutputChannel outputChannel =
gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());
ObjectOutputStream oout =
new ObjectOutputStream(Channels.newOutputStream(outputChannel));
oout.writeObject(content);
outputChannel.waitForOutstandingWrites()