2015-02-06 55 views
1

我希望通过GAE读/写blob到GCS。使用从Google Cloud Storage读取对象始终返回空

我写一个对象(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! 尝试了其他对象序列化方法,但无济于事。

有趣的是,我能够将字符串[byte []]写入存储区并读取回来,没有任何问题。所以不要认为有任何与权限/配置有关的问题。

这发生在localhost以及生产上。

GAE的Java 1.9.17 GCS的AppEngine-GCS-客户0.4.4.jar 谷歌的API服务存储-V1-rev26-1.19.1.jar

有谁知道这可能是出错了?

感谢,阿西

+0

做你'outputChannel.waitForOutstandingWrites()'地方在你的代码完成后,写作? – 2015-02-06 07:51:24

+0

嗨伊戈尔,不,我没有在代码中的waitForOutstandingWrites()。 – AAP 2015-02-06 08:21:10

回答

2

你需要刷新你的写入GCS也通过调用outputChannel.waitForOutstandingWrites(),如:

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

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

谢谢。我添加了行waitForOutstandingWrites(),但仍然没有运气。 – AAP 2015-02-06 09:14:19

+0

你确定你没有写'null'到这个文件吗? – 2015-02-06 09:20:31

+0

哇,谢谢你的提示。我重新检查,我的早期hashmap创建有问题:HashMap data =(HashMap )new HashMap ()。put(“somekey”,“value”);切换到良好的HashMap数据=新的HashMap(); data.put(“key”,“value”);这工作! – AAP 2015-02-06 09:31:43

相关问题