我试图通过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);
Run Code Online (Sandbox Code Playgroud)
其次是:
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(in);
//...
Run Code Online (Sandbox Code Playgroud)
当上面的代码与方法1一起使用时,它会在createXMLStreamReader行上阻塞.当使用方法2/3时,它们会立即抛出IllegalBlockingModeException(我明白为什么).也许需要一种新的方法?
我的目标是让一个非阻塞服务器select => accept来自客户端的字符数据=>使用特定的编码将其解析为XML事件=>将该事件对象转发到另一个线程进行处理=>并返回选择.
所以我忽略了一些东西,还是有更好的方法可以使用?如果是这样的话?
谢谢!
您确定需要使用NIO吗?它可能无法提供最初预期的相对好处:
Paul Tyma:请消灭这个神话。NIO并不比IO快
Paul Tyma:编写 Java 多线程服务器 - 旧的就是新的
显示 createXMLStreamReader() 内部阻塞位置的堆栈可能会有所帮助,但它的行为可能符合设计。如果它被设计为针对 InputStreams 工作,则总是 (1) 提供预期的数据量;(2) 结束;或(3)块,那么它不会自动以(通常更复杂和有状态的)方式运行,这种方式可以在读取任意数量的不完整输入后返回,而无需进行大量深入的返工。
| 归档时间: |
|
| 查看次数: |
3705 次 |
| 最近记录: |