8

我正在尝试通过 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 事件 => 将该事件对象转发到另一个线程进行处理 => 并返回到选择。

那么我是否忽略了某些东西,还是有更好的方法可以使用?如果是这样呢?

谢谢!

4

3 回答 3

4

你确定你需要使用 NIO 吗?它可能无法提供最初预期的相对好处:

Paul Tyma:请消除神话。NIO并不比 IO 快

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

显示它在 createXMLStreamReader() 内部阻塞位置的堆栈可能会有所帮助,但它的行为可能符合设计。如果它被设计为针对总是(1)提供预期数据量的 InputStreams;(2) 结束;或 (3) 阻塞,那么它不会自动以一种(通常更复杂和有状态的)方式运行,这种方式可以在读取任意数量的不完整输入后返回,而无需进行大量深度返工。

于 2009-07-03T20:49:19.537 回答
2

我也开始四处寻找,也用于 XMPP 服务器。我一直在环顾四周,似乎只有一种实现承诺支持 NIO:Aalto http://wiki.fasterxml.com/AaltoHome

But it seems to have released up to version 0.9.5, March 2009. So, I'm not sure how well maintained it is, but this might be a good starting point. Unless you can convince a bigger project (maybe Woodstox), to rework some of their internal classes for NIO support.

于 2009-10-13T23:28:31.693 回答
0

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

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

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

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

这意味着您将无法进行非阻塞 I/O。

于 2009-06-25T18:54:50.830 回答