我从管道处理程序对象中的底层网络层接收字节数组(实际上是netty的ByteBufs),如下所示:
class Handler {
...
private SAXParser parser = ...;
private ContentHandler handler = ...;
void process(byte[] request) {
parser.parse(???, handler);
}
}
每个请求多次调用 Handler.process()
(当数据从网络到达时)。如何将数据提供给解析器而不缓冲请求到单个庞大的数据单元?
答案 0 :(得分:3)
使用new ByteArrayInputStream(request)
。
答案 1 :(得分:0)
几乎所有XML解析器都假定源始终在它请求时提供它想要的字节。当源中没有足够的字节数时,它会阻止源阻塞,直到它有字节为止。
此设计与非阻塞源冲突,例如Netty频道。
要解决此阻抗不匹配问题,您需要确保ByteBuf
包含完整的XML文档。您可以确保使用XmlFrameDecoder
。 XmlFrameDecoder
生成带有完整XML文档的ByteBuf
后,您可以通过使用ByteBufInputStream
包装缓冲区将其提供给您喜欢的解析器。例如:
InputStream in = new ByteBufInputStream(buf);
parser.parse(in, handler);