题
我试图在一个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。