我试图在一个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异常(我不明白为什么)。也许需要一种新的方法?

我的目标是具有非阻挡服务器选择=>从客户端接受字符数据=>使用特定编码=>转发事件对象到另一个线程处理=>并返回到它解析成XML事件选择。

所以,我俯瞰的东西,或者是有没有更好的办法,可以用吗?如果是的话是什么?

谢谢!

有帮助吗?

解决方案

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

保罗季马:杀神话吧。 NIO是的比IO 更快

保罗季马:编写Java多线程服务器 - 什么是老新

表示在内部createXMLStreamReader()被阻塞可以帮助,但它可能表现为设计器的堆栈。如果它被设计为针对其InputStreams总是工作:(1)得到的数据的预期量; (2)端部;或(3)块,则它不会自动表现在能够读取不完整输入的任何量之后返回,而无需大量的深改造的(通常更复杂和有状态)的方式。

其他提示

我也开始四处寻找,也为XMPP服务器使用。我一直在四处寻找,它看起来像只有一条实现其承诺NIO支持:阿尔托的http://维基。 fasterxml.com/AaltoHome

但它似乎已经发布了多达0.9.5版本,2009年3月所以,我不知道如何维护它,但是这可能是一个很好的起点。除非你能说服一个更大的项目(也许Woodstox),返工他们的一些内部类的支持NIO。

您需要使用java.nio.channels.Channels实用工具类。

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

您可能需要配置所述插座信道为封锁。

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

这意味着你不会能够做到非阻塞I / O。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top