ユーザーに文字の入力を開始するよう促したいのですが、control + d を押して終了するまで、好きなだけ文字を入力できるようにしたいと考えています。
たとえば、1234567 のような数字の文字列を入力し、control+d を押すとすぐに、入力した行が表示されます (Return を押す必要はありません)。
バッファ付きリーダーか何かが必要になると思います。助言がありますか?
ユーザーに文字の入力を開始するよう促したいのですが、control + d を押して終了するまで、好きなだけ文字を入力できるようにしたいと考えています。
たとえば、1234567 のような数字の文字列を入力し、control+d を押すとすぐに、入力した行が表示されます (Return を押す必要はありません)。
バッファ付きリーダーか何かが必要になると思います。助言がありますか?
rlibby が言ったことは的を射ています: CTL-D は端末にバッファされた入力を JVM にフラッシュさせます。ただし、キー押下イベント自体は端末によってキャプチャおよび処理され、通過しません。
幸いなことに、それは簡単に検出できます。ユーザーが独自の行で CTL-D をヒットした場合、フラッシュする入力はありません... JVM にとっては、EOF と区別できません。したがって、の契約に従ってSystem.in.read()
返品されます。でラップした場合は、が返されます。-1
InputStream
System.in
BufferedReader
readLine()
null
これは、私が書いたばかりの対話型コマンド ライン ツールのメイン ループです。
BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
String line;
while((line = systemIn.readLine()) != null) {
// my program loop.
}
指摘する価値のあることの 1 つは、ユーザーが文字を入力した後 (ただし、Return を押す前に) CTL-D を押すと、それらの文字が取得されることです。CTL-D が独自の回線上にない場合に CTL-D を検出する方法があるとは思えません。
免責事項:これが Windows にどのように適用されるかはわかりません。
Java プログラムと端末の役割を混同しています。ターミナルは入力をバッファリングし、特にライン フィードの後で、時々 Java プログラムに供給します。Ctrl+D を押すと、端末はバッファリングされた入力を使用可能にするか、何もバッファリングされていない場合は入力を終了します。Ctrl+D で何かを実行するようにプログラムに要求することは、基本的に、使用可能なすべての入力を読み取ったときに何かを実行するように要求することです (後でさらに多くの入力が使用可能になる可能性があります)。Java 側での入力のバッファリングは、事態を軽減するどころか、より複雑にします。
GUI では、KeyListener を使用できます。