【问题标题】:Trailing null (\x00) characters when writing text to Accumulo将文本写入 Accumulo 时尾随空 (\x00) 字符
【发布时间】:2014-02-06 00:49:03
【问题描述】:

我正在尝试将文件名写入 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 中返回了该字符串,该 XSL 应该在当有这些额外的字符时,XML 不再起作用(也不知道为什么会这样)。

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

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

【问题讨论】:

  • 这可能会有所帮助。接受的答案有一个删除空字符的正则表达式。 stackoverflow.com/questions/2362302/…
  • 谢谢!我会研究一下,看看它是否有效。
  • 转义跟它有什么关系?问题在于尾随的空值。找到它的来源并修复它。很可能您忽略了某处 read() 返回的长度,并假设它填满了缓冲区。
  • 好点。但是一切都使用来自 accumulo 库的 Java 方法调用,因为我没有写任何需要调用读取或查看缓冲区的内容。

标签: java accumulo


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这就是问题所在!我最终使用了 System.arraycopy,它就像一个魅力!
  • HTH -- 文本是避免重复创建和删除对象带来的 GC 痛苦的一种非常好的方法,但是 API 可以让您像这样很快地自取其辱 ;)
  • 酷,好点子!顺便说一句,忘了提,当然我们使用的是 hadoop 0.20 ......这就是我必须使用 arraycopy 的原因。
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多