Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自javanio通道的StAX解析_Java_Xml_Nio_Stax - Fatal编程技术网

来自javanio通道的StAX解析

来自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

我试图通过JavaNIO通道接收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 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更快的权限。但它可以。