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



我正在尝试将文件名写入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);

但没有什么异常出现在那里(也许\0没有逃脱)?但是,如果我在accumulo中的表上进行扫描,文件名中会有一个或多个\x00。

这似乎造成的问题是,当我检索文件列表(它显示的位置)并将其传递回浏览器时,我会在XML中返回该字符串,当存在这些额外字符时,本应在XML中呈现信息的XSL将不再工作(也不确定为什么会出现这种情况)。

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

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

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

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

必须遵守Text类提供的长度。有关更多信息,请参阅Textjavadoc。如果您使用的是Hadoop-2.2.0,则可以在Text上使用提供的copyBytes方法。如果您使用的是Hadoop的旧版本,而该方法还不存在,那么您可以使用类似ByteBuffer类或System.arraycopy方法的方法来获得byte[]的副本,并强制执行适当的限制。

最新更新