2014-01-16 23 views
0

我正在嘗試將文件的名稱寫入Accumulo。我正在使用accumulo-core-1.43。將文本寫入Accumulo時,尾部爲空( x00)字符

出於某種原因,某些文件似乎被寫入Accumulo,並在名稱末尾有\ x00個字符。上傳是通過一個Java servlet(使用jquery文件上傳插件)。在servlet中,我檢查了的System.out.println文件的名稱和它看起來很正常,我甚至試圖與

org.apache.commons.lang.StringEscapeUtils.unescapeJava(...); 

實際寫作的反向轉義字符串accumulo看起來像這樣:

Mutation mut = new Mutation(new Text(checkSum)); 
Value val = new Value(new Text(filename).getBytes()); 
long timestamp = System.currentTimeMillis(); 
mut.put(new Text(colFam), new Text(EMPTY_BYTES), timestamp, val); 

但沒有什麼不尋常的出現在那裏(也許\ x00沒有逃脫)?但是,如果我在accumulo中對我的表進行掃描,文件名中將會有一個或多個\ x00。

這似乎是造成這個問題的原因是,當我檢索文件列表(顯示位置)時,我返回XML中的字符串,並將該文件傳回給瀏覽器,應該呈現信息的XSL當有這些額外的字符時XML不再起作用(不確定爲什麼這種情況)。

在鉻中,對於這些調用的響應,我看到文件名後面有三個紅點,當我將鼠標懸停在它上面時,\ u0彈出(我認爲它是0/null的不同表示形式? )。

無論如何,我只是想弄清楚爲什麼會發生這種情況,或者至少在我用Java返回文件之前如何過濾出\ x00個字符。有任何想法嗎?

+0

這可能有幫助。接受的答案有一個正則表達式,用於刪除空字符。 http://stackoverflow.com/questions/2362302/error-about-invalid-xml-characters-on-java – austin

+0

謝謝!我會研究一下,看看它是否有效。 – jfoo

+0

轉義與它有什麼關係?這是問題的尾隨null。找到來自哪裏並修復它。很可能你忽略了'read()'返回的長度,並假定它填充了緩衝區。 – EJP

回答

2

您可能錯誤地使用了Hadoop Text類 - 這不是Accumulo的錯誤。具體來說,你犯這樣的錯誤在你上面的例子:

Value val = new Value(new Text(filename).getBytes()); 

必須堅持由Text類提供的長度。有關更多信息,請參閱Text javadoc。如果您使用Hadoop-2.2.0,則可以使用上提供的copyBytes方法。如果您使用的是早期版本的Hadoop,但此方法尚不存在,則可以使用類似ByteBuffer類或System.arraycopy方法的方法獲取byte []的副本,並強制執行正確的限制。

+0

謝謝,那就是問題所在!我結束了使用System.arraycopy,它就像一個魅力! – jfoo

+0

HTH - 文字可以成爲避免重複對象創建和刪除的GC痛苦的一種非常好的方式,但是API可以讓你像這樣快速地拍攝自己的腳;) – elserj

+0

酷,很棒的一點!順便說一句,忘了提及,當然我們正在使用hadoop 0.20 ...這就是爲什麼我必須使用arraycopy。 – jfoo

相關問題