使用Java在MongoDB中存储byte []

时间:2015-06-01 06:25:03

标签: java mongodb

我将文档插入到一个字节为[]字段的集合中。当我查询插入的文档以获取该字段时,它返回不同的byte []。我该如何解决这个问题?

byte[] inputBytes = ...

MongoCollection<Document> collection = _db.getCollection("collectionx");
Document doc = new Document("test", 1).append("val", inputBytes);
collection.insertOne(doc.getDocument());

MongoCursor<Document> result = collection.find(eq("test", 1)).iterator();
Document retrived_doc = cursor.next();
cursor.close();

byte[] outputBytes = ((Binary)retrived_doc.get("val")).getData();

// inputBytes = [B@719f369d
// outputBytes = [B@7b70cec2

3 个答案:

答案 0 :(得分:3)

您可以对字节数组进行编码并将其存储在doc中,并在解压缩后对其进行解码以检索原始数据。

static String   encodeBase64String(byte[] binaryData)

使用base64算法对二进制数据进行编码,但不会对输出进行分块。

static byte[]   decodeBase64(String base64String)

将Base64字符串解码为八位字节。

请参阅此链接 - https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

答案 1 :(得分:3)

问题不是你的代码,而是你如何检查两个数组 - 输入和输出数组 - 是否相等。您似乎只是在两个结果上比较调用toString()的结果。但是toString()没有被数组类型覆盖,所以它实际上是Object.toString(),它只返回一个对象的类型和哈希码:

  

Object类的toString方法返回一个由。组成的字符串   对象是实例的类的名称,at-sign   字符`@&#39;,以及散列的无符号十六进制表示   对象的代码。换句话说,此方法返回一个相等的字符串   价值:

getClass().getName() + '@' + Integer.toHexString(hashCode())

所以[B@719f369d表示:&#39;字节数组&#39; ([B),哈希码为0x719f369d。它与数组内容无关。

在您的示例中,输入和输出数组是两个不同的对象,因此它们具有不同的内存地址和哈希代码(由于事实上,hashCode()也未被数组类型覆盖)。

<强>解决方案

如果要比较两个字节数组的内容,请调用Arrays.equals(byte[], byte[])

如果要打印字节数组的内容,请调用Arrays.toString(byte[])将内容转换为人类可读的String

答案 2 :(得分:3)

MongoDB支持org.bson.types.Binary类型

您可以使用:

BasicDBObject("_id", Binary(session.getIp().getAddress()))

二进制比较将允许它