Java 从数据库获取字节数组
我想从数据库mongo中获取一个字节数组java并对其进行操作,将其作为原始图像发送到DOM,等等Java 从数据库获取字节数组,java,angularjs,mongodb,Java,Angularjs,Mongodb,我想从数据库mongo中获取一个字节数组java并对其进行操作,将其作为原始图像发送到DOM,等等 BasicDBObject condition = new BasicDBObject("_id", new ObjectId(_id)); DBObject dataset = DataAccess.GetInstanceClass().Getdatasets().findOne(condition); byte[] image = (byte[]) dataset.get("i
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);
这只会返回
信息:提供商:[B@3b249009做:
System.out.println("provider: " + image);
或:
这两种方法都会打印数组的默认toString,在您的例子中,它是指向数组的指针,非常难看[B@3b249009
如果您想查看字节数组更有用的字符串表示形式,可以从以下内容中找到答案:
另外,正如你所指出的,事实上你不需要,也不应该这样做
dataset.get("image").toString().getBytes();
你把你的数据弄得乱七八糟
我编写了一个简短的测试来演示如何从MongoDB中获取字节数组,以及将其作为默认字符串写入与使用Arrays.toString方法的区别:
[B@3b249009是对字节[]调用toString的结果对象。最初,我想将其转储到glassfish控制台中,只是为了让我确信它正在返回,然后我想将其作为图像返回到视图中。如果我愿意,Java似乎会提供一种转换方法。这就是调试器或单元测试的目的,而不是修改源代码以发出调试垃圾:在任何情况下,y您将希望开始查看dataset.getimage的结果,而不是所有其他不必要转换的结果。actualValue.toString.getBytes操作将有效地删除它拥有的任何有用的[typed]值-如上所述,byteArrayObject.toString将返回[B@deadbeef这不是你想要的。好的。是的,当然!来回的类型转换是ludricrous的,并且表达了过程中的特定时刻和挫折程度。因此,根据你的建议,我回到了我开始使用的内容:ie;dataset.get,它返回一个类似的对象[B@438d3c21只是不知道该怎么办。我从StackOverflow尝试了很多解决方案,都没有用。可能是字符串[B@438d3c21是存储的吗?如果是,那么我怀疑它是在字节[]被意外地按照上述方式字符串化之后存储的。
System.out.println("byte array as pretty string: " + Arrays.toString(image));
dataset.get("image").toString().getBytes();
@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));
}