来自javanio通道的StAX解析
我试图通过JavaNIO通道接收XML事件流。我对NIO和StAX解析都是新手,所以我很容易忽略了一些东西: 我的搜索让我找到了几个SAX和StAX实现,但它们似乎都在InputStreams和InputSources上运行,而不是NIO通道。我最近的两次尝试是从通道获取InputStream并创建PipedInputStream:来自javanio通道的StAX解析,java,xml,nio,stax,Java,Xml,Nio,Stax,我试图通过JavaNIO通道接收XML事件流。我对NIO和StAX解析都是新手,所以我很容易忽略了一些东西: 我的搜索让我找到了几个SAX和StAX实现,但它们似乎都在InputStreams和InputSources上运行,而不是NIO通道。我最近的两次尝试是从通道获取InputStream并创建PipedInputStream: // method 1 PipedOutputStream out = new PipedOutputStream(); InputStream in = new
// 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 character data from a client=>parse it to XML events using a specific encoding=>将该事件对象转发给另一个线程进行处理=>并返回到selecting
那么,我是否忽略了什么,或者是否有更好的方法可以使用?如果是,什么
谢谢 您需要使用java.nio.channels.channels实用程序类
ReadableByteChannel ch = //...
InputStream in = Channels.newInputStream(ch);
您可能需要将套接字通道配置为阻塞
SelectableChannel ch = //...
ch.configureBlocking(true);
这意味着您将无法执行非阻塞I/O。您确定需要使用NIO吗?它可能无法提供最初预期的相对效益: 保罗·提马: 保罗·提马:
显示createXMLStreamReader内部阻止位置的堆栈可能会有所帮助,但它的行为可能与设计的一样。如果它是针对输入流设计的,输入流总是1给出预期的数据量;2结束;或3块,则它不会以通常更复杂和有状态的方式自动运行,在读取任何数量的不完整输入后都可以返回,而无需进行大量深入的修改 我也开始四处寻找,也是为了XMPP服务器的使用。我一直在环顾四周,似乎只有一个实现承诺支持NIO:Aalto
但它似乎在2009年3月发布了0.9.5版。所以,我不确定它的维护情况如何,但这可能是一个很好的起点。除非你能说服一个更大的项目,可能是Woodstox,为NIO支持重新编写一些内部类。是的,注意到在我发布之后,我添加了configureBlocking调用,它应该可以修复方法3。阻塞的问题是我试图在每个连接上都没有线程,而是单线程读取,然后根据需要进行额外的处理。你和我都是:现在,我们正试图为完全相同的应用程序解决完全相同的问题。有趣。快速评论:虽然从Aalto页面上看可能不明显,但它的开发者群与Woodstox有很大的重叠。部分原因是Aalto的内部结构非常不同,要使基于生物的系统在NIO上工作并不容易。另一方面,Aalto与NIO非常匹配——它具有异步模式,虽然未完全定义位不完整的API,但非常接近于生产就绪。因此,如果有人感兴趣,欢迎加入Aalto讨论论坛——包括我在内的开发人员都希望看到更多的参与。正如Fern提到的,Aalto xml处理器具有异步模式,这是为此类用例设计的。没有太多人对基于NIO的系统感兴趣。。。然而,对于异步模式(所有现有用户似乎都使用BIO),它实际上非常适合。最后,对于版本0.9.7,有一些文档说明了如何进行非阻塞解析,请参阅:NIO没有被授予比默认I/O更快的权限。但它可以。