Java 如何从xml解析二进制数据?
正在尝试为学校项目使用Java 如何从xml解析二进制数据?,java,xml,jaxb,sax,stax,Java,Xml,Jaxb,Sax,Stax,正在尝试为学校项目使用STAX解析xml。如果我有一个元素: <binary data></binary data> 有一个可以让你读二进制“零碎的”。谢谢。我可以使用这个方法和流或者其他什么,这样我就不需要把所有的东西都保存在内存中了吗?请看我问题中的edit。如果你将它输入到聚合器,你仍然会得到内存中的所有内容,除了长度将被限制为缓冲区的长度。要做什么实际上取决于您必须对数据做什么:如果您想要流式输出数据,您可以简单地将读取的数据写入输出流,并从缓冲区的开始处开始。
STAX
解析xml。如果我有一个元素:
<binary data></binary data>
有一个可以让你读二进制“零碎的”。谢谢。我可以使用这个方法和流或者其他什么,这样我就不需要把所有的东西都保存在内存中了吗?请看我问题中的edit。如果你将它输入到聚合器,你仍然会得到内存中的所有内容,除了长度将被限制为缓冲区的长度。要做什么实际上取决于您必须对数据做什么:如果您想要流式输出数据,您可以简单地将读取的数据写入输出流,并从缓冲区的开始处开始。如果要搜索该数据中的某些内容,可以搜索缓冲区并丢弃数据。具体行动取决于你想要达到的目标。请容忍我。最后,我需要将这些数据保存到db中,所以我需要InputStream。所以我需要写入OutputStream,然后通过管道传输,对吗?如果你有时间的话,你能写一些代码吗?我没有太多时间,这就是为什么我要把它写进评论,而不是答案。实际上,您正在做的是流复制。查看并获取有关如何有效执行此操作的信息。
private byte[] readBinary(XMLStreamReader2 sr) throws XMLStreamException {
Stax2Util.ByteAggregator aggr = new Stax2Util.ByteAggregator();
byte[] buffer = aggr.startAggregation();
while (true) {
int offset = 0;
int len = buffer.length;
do {
int readCount = sr.readElementAsBinary(buffer, offset, len);
if (readCount < 1) { // all done!
return aggr.aggregateAll(buffer, offset);
}
offset += readCount;
len -= readCount;
} while (len > 0);
buffer = aggr.addFullBlock(buffer);
}
}