繁体   English   中英

从Java NIO通道解析StAX

[英]StAX parsing from Java NIO channel

我试图通过Java NIO通道接收XML事件流。 我是NIO和StAX解析的新手,所以我很容易忽略一些东西:)

我的搜索让我进入了几个SAX和StAX实现,但它们似乎都在InputStreams和InputSources上运行 - 而不是NIO通道。 我最近的两次尝试是从通道获取InputStream并创建一个PipedInputStream:

// method 1
PipedOutputStream out = new PipedOutputStream();
InputStream in = new PipedInputStream(out);
PrintWriter writer = new PrintWriter(out);

//method 2
InputStream in = channel.socket().getInputStream()
//method 3
IputStream in = Channels.newInputStream(channel);

其次是:

XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance()
        .createXMLStreamReader(in);
//...

当上面的代码与方法1一起使用时,它会在createXMLStreamReader行上阻塞。 当使用方法2/3时,它们会立即抛出IllegalBlockingModeException(我明白为什么)。 也许需要一种新的方法?

我的目标是让一个非阻塞服务器select => accept来自客户端的字符数据=>使用特定的编码将其解析为XML事件=>将该事件对象转发到另一个线程进行处理=>并返回选择。

所以我忽略了一些东西,还是有更好的方法可以使用? 如果是这样的话?

谢谢!

你确定需要使用NIO吗? 它可能无法提供原先预期的相对利益:

保罗泰玛: 请杀死神话。 NIO 并不比IO快

Paul Tyma: 编写Java多线程服务器 - 什么是旧的

显示内部createXMLStreamReader()阻塞的堆栈可能会有所帮助,但它可能表现得像设计的那样。 如果它被设计为对InputStreams起作用,它总是(1)给出预期的数据量; (2)结束; 或者(3)阻止,然后它不会自动表现为(通常更复杂和有状态)的方式,可以在读取任何数量的不完整输入后返回,而无需大量深度返工。

我也开始四处寻找,也用于XMPP服务器。 我一直在寻找,看起来只有一个实现承诺NIO支持:Aalto http://wiki.fasterxml.com/AaltoHome

但它似乎已经发布到2009年3月的0.9.5版本。所以,我不确定它的维护情况如何,但这可能是一个很好的起点。 除非你能说服一个更大的项目(也许是Woodstox),否则他们会为NIO支持重做一些内部课程。

您需要使用java.nio.channels.Channels实用程序类。

ReadableByteChannel ch = //...
InputStream in = Channels.newInputStream(ch);

您可能需要将套接字通道配置为阻止。

SelectableChannel ch = //...
ch.configureBlocking(true);

这意味着您将无法执行非阻塞I / O.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM