質問

私は、Java NIOのチャネルを介してXMLイベントのストリームを受信しようとしています。私は、NIOとStAXの解析の両方に新しいですので、私は非常に簡単に何かを見下ろすことができます。)

私の検索では、いくつかのSAXやStAXの実装に私を導いているが、それらはすべて、入力ストリームとInputSourceが上で動作するように見える - ない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);
//...

上記のコードは、それがcreateXMLStreamReaderライン上のブロックは、方法1で使用された場合。メソッド2/3が使用されるとき、彼らはすぐにIllegalBlockingModeExceptionをスロー(私は理由を理解します)。たぶん、新しいアプローチが必要なのでしょうか。

私の目標は、=>特定のエンコーディング=>は処理=>のために別のスレッドにそのイベントオブジェクトを転送しに戻って使用してXMLイベントにそれを解析> =ノン・ブロッキングサーバが選択したクライアントからの文字データを受け入れることです選択ます。

だから私は何かを見下ろす午前、または使用することができ、より良いアプローチはありますか?もしそうなら何?

ありがとうございます。

役に立ちましたか?

解決

あなたがNIOを使用する必要がありますか?これは、当初の予想相対的な利点を提供しないことがあります:

ポール・Tyma:神話を殺してください。 NIOはのないのIO をより速く

ポール・Tyma:書くのJavaマルチスレッドサーバー - いただきました!古いです新しい

どこcreateXMLStreamReaderの内側に示す

スタック()助けることができるブロックしているが、設計されたとして、それはおそらく動作しています。それは、常にどちらか(1)データの予想量を与え、入力ストリームに対して動作するように設計された場合は、 (2)終了。または(3)ブロック、それは自動的に深いリワークの多くせずに、不完全な入力の任意の量を読んだ後に返すことができます(通常はより複雑でステートフル)のように動作しません。

他のヒント

私はまた、XMPPサーバーの使用のためにも、周りを探し始めました。私は周りを探してきたとNIOサポートを約束唯一の実装があるように見えます:アアルトます。http://ウィキは。 fasterxml.com/AaltoHomeする

しかし、それはバージョン0.9.5までリリースしているようですが、2009年3月には、だから、私はそれがよく維持かどうかはわかりませんが、これは良い出発点かもしれません。あなたはNIOのサポートのために彼らの内部クラスの一部を手直しするために、より大きなプロジェクト(多分Woodstox)を説得することができない限ります。

あなたはjava.nio.channels.Channelsユーティリティクラスを使用する必要があります。

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

あなたがブロックされるソケットチャネルを設定する必要があります。

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

これは、ノンブロッキングI / Oを行うことができないことを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top