2015-02-06 84 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