将字节[]提供给SAXParser

时间:2014-08-19 20:49:23

标签: java xml-parsing netty sax saxparser

我从管道处理程序对象中的底层网络层接收字节数组(实际上是netty的ByteBufs),如下所示:

class Handler {
    ...
    private SAXParser parser = ...;
    private ContentHandler handler = ...;
    void process(byte[] request) {
        parser.parse(???, handler);
    }
}
每个请求多次调用

Handler.process()(当数据从网络到达时)。如何将数据提供给解析器而不缓冲请求到单个庞大的数据单元?

2 个答案:

答案 0 :(得分:3)

使用new ByteArrayInputStream(request)

答案 1 :(得分:0)

几乎所有XML解析器都假定源始终在它请求时提供它想要的字节。当源中没有足够的字节数时,它会阻止源阻塞,直到它有字节为止。

此设计与非阻塞源冲突,例如Netty频道。

要解决此阻抗不匹配问题,您需要确保ByteBuf包含完整的XML文档。您可以确保使用XmlFrameDecoderXmlFrameDecoder生成带有完整XML文档的ByteBuf后,您可以通过使用ByteBufInputStream包装缓冲区将其提供给您喜欢的解析器。例如:

InputStream in = new ByteBufInputStream(buf);
parser.parse(in, handler);