繁体   English   中英

从数据库获取字节数组

[英]get byte array from database

我想从数据库(mongo)获取一个字节数组(java)并对其进行操作,将其作为原始图像发送到DOM等。

BasicDBObject condition = new BasicDBObject("_id", new ObjectId(_id));
    DBObject dataset = DataAccess.GetInstanceClass().Getdatasets().findOne(condition);
    byte[] image = (byte[]) dataset.get("image").toString().getBytes();

    String s = new String(image);
    System.out.println("provider: " + s);

这只会返回INFO:提供程序:[B @ 3b249009

正在做:

System.out.println("provider: " + image);

要么:

System.out.println("provider: " + new String(image));

两者都导致打印数组的默认toString() ,它是指向数组的指针(在您的情况下,是相当难看的[B@3b249009 ))

如果要查看字节数组的更有用的String表示形式,可以找到此问题的答案:

System.out.println("byte array as pretty string: " + Arrays.toString(image));

另外,正如您所指出的,您不需要(实际上不应该)

dataset.get("image").toString().getBytes();

您正在通过各种方式处理数据。

我编写了一个简短的测试来演示如何从MongoDB中获取字节数组,以及将其写为默认String与使用Arrays.toString()方法的Arrays.toString()

@Test
public void shouldBeAbleToGetANiceStringRepresentationOfAByteArray() {
    // given
    ObjectId id = new ObjectId();
    byte[] bytes = {1,2,3,4};
    collection.insert(new BasicDBObject("_id", id).append("image", bytes));

    // when 
    BasicDBObject condition = new BasicDBObject("_id", id);
    DBObject dataset = collection.findOne(condition);
    byte[] image = (byte[]) dataset.get("image");

    // then
    // this instanceof is actually pointless, since casting it to a byte array above means it must be a byte array, but the point is to demonstrate it's not a String
    assertTrue(image instanceof byte[]);

    assertThat(image.toString(), startsWith("[B@"));
    assertThat(image.toString().length(), is(11));
    System.out.println("byte array toString(): " + image);

    assertThat(Arrays.toString(image), is("[1, 2, 3, 4]"));
    System.out.println("byte array as pretty string: " + Arrays.toString(image));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM