0

我正在尝试将文件名写入 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 没有转义)?但是,如果我在累积中对我的表进行扫描,文件名中将有一个或多个 \x00。

这似乎导致的问题是,当我检索文件列表(它显示的位置)并将其传递回浏览器时,我在 XML 中返回该字符串,应该在 XML 中呈现信息的 XSL 不再当有这些额外的字符时工作(也不知道为什么会这样)。

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

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

4

1 回答 1

2

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

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

必须遵守课程提供的长度Text。有关详细信息,请参阅文本 javadoc。如果您使用的是 Hadoop-2.2.0,则可以copyBytesText. 如果您使用的是尚不存在此方法的旧版本 Hadoop,则可以使用ByteBuffer类或System.arraycopy方法之类的东西来获取 byte[] 的副本,并强制执行适当的限制。

于 2014-01-18T23:17:54.317 回答