在向Accumulo写入文本时尾随空(\ x00)字符

时间:2014-01-16 21:25:11

标签: java accumulo

我正在尝试将文件名写入Accumulo。我正在使用accumulo-core-1.43。

出于某种原因,某些文件似乎写入了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中返回该字符串,该传感器应该呈现信息。当有这些额外的字符时,XML不再有效(不确定为什么会这样)。

在chrome中,对于这些调用的响应,我看到文件名后面有三个红点,当我将鼠标悬停在它上面时,会弹出\ u0(我认为是0 / null的不同表示?)

无论如何,我只是想弄清楚为什么会发生这种情况,或者至少,我如何在用Java返回文件之前过滤掉\ x00字符。任何想法?

1 个答案:

答案 0 :(得分:2)

您可能错误地使用了Hadoop Text类 - 这不是Accumulo的错误。具体来说,你在上面的例子中犯了错误:

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

必须遵守Text类提供的长度。有关详细信息,请参阅Text javadoc。如果您使用的是Hadoop-2.2.0,则可以使用copyBytes上提供的Text方法。如果您使用的是旧版本的Hadoop,此方法尚不存在,您可以使用类似ByteBuffer类或System.arraycopy方法的内容来获取带有正确的byte []的副本限制强制执行。