問題タブ [nio2]
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.
scala - Scala で Java 7 完了ハンドラーをインスタンス化する方法
私はscala(初心者)で遊んでいて、Java 7 NIOを使おうとしていました(簡単に始めたいので)。しかし、受け入れのためにCompletionHandlerをインスタンス化する方法がわかりません。次のコードは間違っており、修正できません。
java - Java の NIO.2 の非同期チャネルがこれらの一時停止を必要とするのはなぜですか?
最小限の例を書きましたが、それでも長すぎるので、代わりに Pastebin へのリンクを投稿する必要があることをお知らせください。
サーバ:
クライアント:
実行するボイラープレート:
したがって、このようなコードがある場合、次の出力が得られます。
sleep()
しかし、これらのを削除するとSrv.runInstance()
、次のようになります。
では、クライアントはサーバーに接続するが、サーバーは拒否するということですか? ここで何が起こっているのかはっきりと理解できず、ドキュメントも貧弱なので、どこで解決策を探すべきかわかりません。
java - Java UserPrincipal を Active Directory ユーザーにマップする
Java を使用してリモート サーバーにアクセスしています。サーバーは Microsoft Windows を実行し、Active Directory とファイル システム共有を提供します。JNDI を介して Active Directory からユーザーとグループを読み取りましたが、これはうまく機能しています。distinguishedName
などのすべてのユーザー属性を取得しますobjectSid
。
私の Java プログラムは、Java 7 と NIO.2 を使用して、同じサーバー上の Windows 共有にも接続します。リモートファイルシステムを読み取って、それに関する情報を取得できます。次のようなファイル許可設定を読み取ることもできます。
このようにして、オブジェクトのアクセス権を取得しUserPrincipal
ます。このクラスは、getName()
何らかの名前または場合によっては SID を返すメソッドのみを提供します。
実際のユーザーの場合、UserPrincipal
オブジェクトは、Active Directory で対応するユーザーを見つけるために使用できる SID を返します。ただし、UserPrincipal
がグループを表す場合はgetName()
、たとえば のようなテキストを返すだけです"VORDEFINIERT\Administratoren"
。
このテキストを Active Directory で定義されたグループにマップする方法が見つかりませんでした。AD の対応するグループには、次のdistinguishedName
プロパティがありますCN=Administratoren,CN=Builtin,DC=mydomain,DC=com
。
Java プログラムが実行されるマシンとサーバーの両方で、ドイツ語版の Windows が実行されています。AD がCN=Builtin
(英語) を返すのに、ファイル システムがグループ名をドイツ語に翻訳して返すのは奇妙ですVORDEFINIERT
。たとえば、両方の場合、Builtin
おそらく を解析して、AD オブジェクトの がどうあるべきUserPrincipal
かを見つけることができdistinguishedName
ます...ただし、このアプローチはあまり信頼できないようです。
UserPrincipal
AD で対応するユーザーまたはグループを見つけることができるように、すべてのオブジェクトの SID を読み取れるようにしたいと考えています。
これを行う方法はありますか?さらに情報が必要な場合はお知らせください。
よろしく、空
io - AsynchronousFileChannel はどのように大きなファイルを読み取ることができますか?
このようにして、large.log から最初の 1000 バイトを読み取ることができます。ByteBuffer.allocate(1000*1000) のような大きなバイト配列を割り当てたくない場合、次のログを読むにはどうすればよいですか。これは OutOfMemory につながると思うからです。
誰かがサンプルコードを教えてくれますか? ありがとう。
ps:java.io.BufferedReader.read()の戻り値を確認できるので、JIOで大きなファイルをループ読みできます。しかし、NIO2 の扱い方がわかりません。
java - これは Java 7 のオフバイワンのバグですか?
Java API ドキュメントと Java コードの説明と確認をどこで求めればよいか分からないので、ここで行います。
の API ドキュメントでFileChannel
、オフ バイ ワン エラー wrt to fileposition
およびsize
複数の場所でのファイルを見つけました。
これはほんの一例です。州の API ドキュメントtransferFrom(...)
:
「指定された位置がファイルの現在のサイズより大きい場合、バイトは転送されません。」
OpenJDKコードにもこのコードが含まれていることを確認しました...
FileChannelImpl.java
...ドキュメントと一致するファイル内。
さて、上記のコード スニペットと API ドキュメントは相互に一貫しているように見えますが、ファイルのデータへの 0 ベースのインデックスであるため、上記は単なる「より大きい」ではなく「以上」であるべきだと「感じます」 。での読み取りには、呼び出し元に返すデータがありません! ( では、少なくとも 1 バイト (ファイルの最後のバイト) が呼び出し元に返される可能性があります。)position
position == size()
position == size() - 1
同じ API ドキュメント ページにある他の同様のインスタンスを次に示します。
position(...)
: "位置をファイルの現在のサイズより大きい値に設定することは正当ですが、ファイルのサイズは変更されません。" (「以上」である必要があります。)transferTo(...)
: "指定された位置がファイルの現在のサイズより大きい場合、バイトは転送されません。" (「以上」である必要があります。)read(...)
: "指定された位置がファイルの現在のサイズより大きい場合、バイトは読み取られません。" (「以上」である必要があります。)
最後に、 の戻り値に関するドキュメント セクションはread(...)
、残りのドキュメントとの一貫性さえ保っていません。ここにそれが述べているものがあります:
戻り値:
読み取られたバイト数。場合によってはゼロ、または指定された位置がファイルの現在のサイズ以上の場合は -1
したがって、この唯一の例では、彼らが正しいことを述べているのを見ます。
全体として、私はこれらすべてをどうすればよいかわかりません。今日、このドキュメントに一致するコードを書いた場合、Java (コードまたはドキュメント) の将来のバグ修正によってコードがバグだらけになり、私の側でも修正が必要になります。今日の状態で正しいことを自分で行うと、最初からコードにバグが発生します。
java - パスごとに 2 つの WatchKey を登録することは何らかの理由で可能ですか?
マイナーな例で問題を再現することはできませんが、WatchService とs が同じ場合、 WatchKeys
1 つに対して2 つの異なるものを登録することは可能ですか?Path
Kind<?>
たとえば、親ディレクトリの内容が変更された場合は?
java-7 - ディレクトリでvisitFileを呼び出すJava 7 walkFileTree
次のディレクトリ構造があるとします
そして、次のビジターを使用するとします。
walkFileTree の単純なオーバーロードを使用すると、次のようになります。
すべてが計画どおりに進み、次の出力が表示されます。
しかし、最大深度を設定しようとすると、状況が崩れ始めます。
出力:
これはバグだと確信していますが、最初にコミュニティに尋ねたいと思いました:何か欠けているものはありますか?これは実際に予期された動作ですか? ご確認ありがとうございます!
詳細:
java - AsynchronousSocketChannel をきれいに閉じるにはどうすればよいですか?
私のサーバーは、を使用AsynchronousServerSocketChannel
してクライアント接続をリッスンする を使用しCompletionHandler
ます。クライアント接続が受け入れられると、AsynchronousSocketChannel
が読み取られ、再び を使用してCompletionHandler
タイムアウトなしでデータを受信します。
これまでのところ、クライアントは接続し、サーバーによって読み取られるデータを書き込みます。サーバーは、同じソケットを介してクライアントにデータを送信することに応答できます。
クライアントが終了すると、 を呼び出しAsynchronousSocketChannel.close()
てソケットを閉じます。この呼び出しが行われると、サーバーはソケットからのデータの読み取りを待機しています。
クライアントでの への呼び出しが、ソケットが閉じられたことを示すサーバーでの読み取り長のAsynchronousSocketChannel.close()
へのコールバックに変換されることを期待していましたが、コールバックには次の例外があります。CompletionHandler.completed
-1
CompletionHandler.failed
サーバー上でエラーと見なされないように、クライアントはどのようにソケットを閉じる必要がありますか?