2017-02-25 18 views
0

これは簡単な問題のようですが、解決できないようです。ユーザーが任意のキーを押すまで、(変数からの)出力をコンソールに出力する必要があります。印刷のようなwhileループで行われる:キーが押されるまで出力を出力します

int i; 
while((i=input.read())!=-1){ 
    System.out.print((char)i); 
} 
input.close(); 

問題は、入力ストリームが決してそれ以上の文字は、このように実行から任意のより多くのコードをブロックする、に来るためだけ待機し、終了だ到達しないことです。ユーザーには出力を停止することは非常に明白なので、その責任をユーザーに与えても問題ありません。ユーザーがアプリケーションを停止するように指示する方法は重要ではありません(クイック入力、スペースの入力、入力など)。事前に

おかげで、
vikarjramun

答えて

1

私は、コンソール入力をスレッディングた思い付いた最初のソリューション。スレッドは、印刷コードでアクセス可能な変数を更新し、各print文の前にチェックすることができます。

import java.util.Scanner; 
import java.util.concurrent.atomic.AtomicBoolean; 

public class RunUntilKeyPressed { 
    static AtomicBoolean hasUserPressedKey = new AtomicBoolean(false); 

    public static void main(String[] args) { 

     Thread t = new Thread(() -> { 
      Scanner scan = new Scanner(System.in); 
      System.out.println(scan.next()); 
      hasUserPressedKey.set(true); 
      scan.close(); 
     }); 
     t.start(); 

     while(!hasUserPressedKey.get()) { 
      System.out.println(hasUserPressedKey); 
     } 
    } 
} 

このコードは、ユーザが(空白を除く)任意のキーを押すまで実行し、scan.next()方法は、入力を取得したときにそれがあるとして入力します。

+0

hasUserPressedKeyをvolatileとしてデリケートしない限り、または普通のブール値 – SergGr

+0

@SergGrの代わりにAtomicBooleanを使用しない限り、このコードは正しく動作しない可能性があります。私は変更を行います – Chris

+0

ありがとう、私はこれを試してみます – vikarjramun

関連する問題