問題タブ [nio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ソケットチャネルを使用してデータを読み書きし、接続を受け入れる方法
Java NIO を使用して単純なサーバー クライアント アプリケーションを作成しました。そこでは、接続の受け入れ、データの読み取り、および書き込みに単一のセレクターを使用しました。しかし、2番目のセレクターがデータを読み取り、3番目のセレクターがデータを書き込む間、1つのセレクターが接続の受け入れでビジーになるアプリケーションが必要です。
つまり、すべての負荷を単一のセレクターに入れたくありません。
これを達成する方法は?オンラインヘルプはありますか
ありがとうディーパック。
// セレクターを作成する Selector selector = Selector.open();
java - NIOサーバーがクライアントをリッスンできません
こんにちは私は単純なJavaNIOサーバーを実装しようとしています。これはsocketChannelをセレクターに登録します。したがって、私はクライアントに耳を傾け、いくつかの応答を送り返したいと思います。socketChannelがセレクターに登録された後、クライアント(非NIO)がデータを送信しても、サーバーは読み取ることができません。ただし、生成されたキーはまだ繰り返されています。
詳細ビュー:サーバー側:
public void run(){while(true){
注意:シングルスレッドで実行すると同じプログラムが機能しますが、上記の方法で実装すると、クライアントをリッスンしなくなります。この問題の解決にご協力ください。
java - TIBCO Rendezvous メッセージのバイト エンコーディングを見つけるにはどうすればよいですか?
私の Java アプリケーションでは、TIBCO RV メッセージをバイトとしてファイルにアーカイブしています。
メッセージを再生する小さなユーティリティ アプリを作成しています。このようにして、ファイルを解析してオブジェクトを手動で構築することなく、バイトから TibrvMsg オブジェクトを作成することができます。
私が抱えている問題は、Linux ボックスで作成されたファイルを読み取っていて、Windows マシンでアプリを実行しようとしていることです。ファイルが書き込まれた文字セットが異なるため、エラーが発生します。
今、私がやりたいことは、各メッセージを特定の文字セット (UTF-8) でログに記録することです。これにより、再生アプリを実行するプラットフォームを気にしなくなります。アプリは、事前に知っているファイルを読み込むだけです。ファイルが書き込まれる文字セット。バイトをある文字セットから別の文字セットに変換するために、これに java.nio パッケージを使用することを計画しています。
変換を行うために、TIBRV メッセージのバイトがエンコードされている文字セットを知る必要がありますか? もしそうなら、どうすればこれを見つけることができますか?
java - 独自のSelectableChannelを定義するにはどうすればよいですか?
新しいタイプ(シリアルポートなど)をどのように定義しjava.nio.channels.SelectableChannel
ますか?
java - SSLEngine とクローズ
SSL で使用されるチャネルからクリーンなデータを取得し、暗号化されたデータをそこに書き込むことができるヘルパー モジュールを実装しました。私には、「DataProvider はインターフェースであるべきだ」と ;)):
SSL の抽象基本クラスを実装しました。その実装のテスト中に、私は 2 つの関数を作成しました。1 つは SocketChannel でメッセージを受信し、データの送信に使用される SSLSocket は接続を閉じます。もう 1 つは、SocketChannel でメッセージを送信し、それで終了を開始します。さて、問題は、これらの手順を実行しても、データの受信に使用される SSLSocket が閉じないことです。
- engine.closeOutbound()
- エンジン.ラップ()
- channel.write(data) (はい、wrap() で取得したすべてのデータを送信したと確信しています)
- 受信 close_notify を読み取るためのチャネルの選択
問題は、セレクターが 4 番目のステップでスタックしていることです。
他のテスト (SSLSocket が接続を閉じる) では、問題はありません。
shouldClose を次のように実装したことに注意してください。
したがって、クローズを初期化したとしても、クローズするには着信 close_notify が必要です (これが正しいかどうかはわかりません: 最終的には で変更できますreturn engine.isOutboundDone()
)
これは、コードの SSLSocket 側です。
最後のアサートに違反しています。
最初は、これは toRead に関連付けられた「バックグラウンド」スレッドがないためだと考えていたので、着信を消費してclose_notify
から最終的にソケットを閉じるために読み取り/書き込みを行う必要がありますが、それでもそうではありませんヘルプ。
何か案が?
java - Java 大容量ファイルのディスク IO パフォーマンス
ハードディスクに 2 つのファイル (それぞれ 2GB) があり、それらを相互に比較したいと考えています。
- Windows エクスプローラーで元のファイルをコピーするには、約 10 分かかります。2 ~ 4 分 (つまり、同じ物理ディスクと論理ディスクでの読み取りと書き込み)。
- 2 回読み取り
java.io.FileInputStream
、バイト単位でバイト配列を比較するには、20 分以上かかります。 java.io.BufferedInputStream
バッファが 64kb の場合、ファイルはチャンクで読み取られてから比較されます。比較が行われるのは、次のようなタイトなループです
/li>
これをスピードアップするにはどうすればよいですか? NIO は通常のストリームよりも速いはずですか? Java は DMA/SATA テクノロジを使用できず、代わりに遅い OS-API 呼び出しを行いますか?
編集:
答えてくれてありがとう。それらをもとに実験を行いました。アンドレアスが示したように
流れや
nio
アプローチに大きな違いはありません。
さらに重要なのは、正しいバッファ サイズです。
これは私自身の実験で確認されています。ファイルは大きなチャンクで読み取られるため、追加のバッファー ( BufferedInputStream
) でさえ何も提供しません。比較の最適化は可能で、32 倍の展開で最良の結果が得られましたが、比較にかかる時間はディスク読み取りに比べて小さいため、高速化はわずかです。どうしようもないですね(-_-;)
java - Java コードを使用して画像許可モードを 777 に変更するには?
Java コードを使用して、画像ファイルに許可モード値「777」を付与したいと考えています。Javaを使用してそれを与えるにはどうすればよいですか? デフォルトの許可モード「664」では画像を削除できないためです。
java - Process stdoutInputStreamをNIOByteBufferに読み込むことは可能ですか?
NIOを使用してプロセスからstdoutを処理することは可能ですか?私はそれをjava.ioで動作させていますが、これはNIOについてもう少し学び、パフォーマンスの向上の可能性を探求するための演習のようなものです。
基本的に、大量のテキストをstdoutからバッファにブロックせずにできるだけ速くストリーミングし、後でそのバッファの内容を処理したいと思います。問題は、NIOで動作させるための適切なブードゥーを理解できないようです。これが私が今いるところです:
StreamConsumerクラスは次のようになります。
java - java.nio チャネル バッファ ストリーム 用語
java.io と java.nio のバッファ、ストリーム、リーダー、チャネル、セレクターなどの関係を説明するための良い類推 (または、それが失敗した場合は良いリソース) を持っている人はいますか?
ありがとう
java - Java NIO チャネルからの StAX 解析
Java NIO チャネルを介して XML イベントのストリームを受信しようとしています。私はNIOとStAXの両方の解析に慣れていないので、何かを見落としがちです:)
検索の結果、いくつかの SAX および StAX の実装にたどり着きましたが、それらはすべて、NIO チャネルではなく、InputStreams および InputSources で動作するようです。私が行った 2 つの最も近い試みは、チャネルから InputStream を取得し、PipedInputStream を作成することです。
に続く:
上記のコードを方法 1 で使用すると、createXMLStreamReader 行でブロックされます。メソッド 2/3 が使用されると、すぐに IllegalBlockingModeException がスローされます (理由は理解しています)。新しいアプローチが必要かも?
私の目標は、非ブロッキングサーバーを選択する=>クライアントから文字データを受け入れる=>特定のエンコーディングを使用してXMLイベントに解析する=>そのイベントオブジェクトを別のスレッドに転送して処理する=>選択に戻ることです。
だから私は何かを見落としていますか、それとも使用できるより良いアプローチがありますか? もしそうなら何?
ありがとう!