Jython中HBase Bytes.toString(byte [] b)的结果无效

时间:2012-02-24 23:30:06

标签: java jython hbase

想知道我在这里做错了什么。在Java 1.5上使用Jython 2.2.1和Hbase 0.90。无法让Bytes.toString(byte[] b)工作。它返回看起来像地址的内容。但是当我使用重载的Bytes.toString(byte[] b, int off, int len)时,它会返回正确的结果。

g = Get(Bytes.toBytes(id))
res = self.table.get(g)

t = res.getValue(Bytes.toBytes('stuff'), Bytes.toBytes('t'))
print Bytes.toString(t)              // returns stuff like '[B@12121212'
print Bytes.toString(t, 0, len(t))   // returns the string properly

之前有人见过这个吗?

2 个答案:

答案 0 :(得分:2)

你没有做错任何事。我在Java 1.8和HBase 1.2.4上运行Jython 2.7并且遇到了完全相同的行为。以下是似乎正在发生的事情:Java支持多个接受不同参数集的相同名称的方法,因此Jython内部必须使用接受不同参数的相同名称消除多个方法之间的歧义。正在转换为字符串的Byte []数组表示为Python数组或其某个子类,它具有接受一个参数(self)的toString()方法。 ' Bytes' object,作为它的子类,同时包含Python array.toString(self)方法和Java .toString(final [] byte b)和.toString(final [] byte b,int off,int len)方法。 / p>

必须是构造Bytes对象的方式导致Python的.toString(self)取代Java的.toString(final [] byte b),但另一种方法仍然有效,因为有没有Python .toString()方法,带有三个参数来取代另一个Java .toString()。 (见https://docs.python.org/2.7/library/array.html?highlight=tostring#array.array.tostring

解决方案:修改后的导入以及一些额外的代码行修复此问题。

import org.apache.hadoop.hbase.util.Bytes as BrokenBytes
class Bytes(BrokenBytes):
    @staticmethod
    def toString( x ): return( BrokenBytes.toString( x, 0, len( x ) ) )

答案 1 :(得分:0)

不可能。你所做的事情必须比你发布的更多。 toString的第一个重载调用第二个。这是源代码(来自HBase 0.90.3):

  /**
   * @param b Presumed UTF-8 encoded byte array.
   * @return String made from <code>b</code>
   */
  public static String toString(final byte [] b) {
    if (b == null) {
      return null;
    }
    return toString(b, 0, b.length);
  }

  /* snip */

  /**
   * This method will convert utf8 encoded bytes into a string. If
   * an UnsupportedEncodingException occurs, this method will eat it
   * and return null instead.
   *
   * @param b Presumed UTF-8 encoded byte array.
   * @param off offset into array
   * @param len length of utf-8 sequence
   * @return String made from <code>b</code> or null
   */
  public static String toString(final byte [] b, int off, int len) {
    if (b == null) {
      return null;
    }
    if (len == 0) {
      return "";
    }
    try {
      return new String(b, off, len, HConstants.UTF8_ENCODING);
    } catch (UnsupportedEncodingException e) {
      LOG.error("UTF-8 not supported?", e);
      return null;
    }
  }