2012-10-23 10 views
6

可能性の重複:
Writing data to System.inJavaではSystem.inに値を割り当てる方法は?

我々はSystem.in(標準入力)がコンソールに接続されていることを知っています。コンソールに書き込むたびに、このストリームに流れます。しかし、コンソールから入力することなく、この標準入力に値を渡す方法はありません。つまり、System.in = "ABCD"のようになります。私はちょうど値がコンソールから渡っているので真似したいと思う。

+0

正確に何をしたいですか?私は何かODDのように聞こえる。実際にあなたはSystem.inにあるものを読み、それに割り当てません。 –

答えて

13

はい、あります。 System.setIn(InputStream in)を使用してください。

あなたが特定の値を指定したい場合、あなたはStringBufferInputStreamを使用することができますので、あなたがそうのように、だけでなくInputStreamの任意のサブタイプを供給することができます:

StringBufferInputStream s = new StringBufferInputStream("ABCD"); 
System.setIn(s); 
+1

+1 'public final static InputStream' –

+0

と宣言されていますが、複数のスレッドでは機能しません。私は1つのスレッドでSystem.setIn(s)を使用し、別のスレッドではScanner.nextLine()を使用しています。あるスレッドからSystem.SetInに値を渡すと、Scanner.nextLine()が使用されている他のスレッドには何の効果もありません。複数のスレッドで動作させる方法はありますか? – Angom

+2

私が読んでいるように、あなたはすでに第2のスレッドに 'Scanner'を作成しています、*最初のスレッドで' System.in'を変更する前*です。スキャナは、作成中に供給された 'InputStream'への参照を保持します。 2番目のスレッドで 'Scanner'を作成する前に最初のスレッドから' System.setIn(...) 'を呼び出す場合、問題なく動作します。 – mthmulders

0

私はその代わりに、あなたの方法で直接アクセスすることを考えますSystem.in:

public void run() { 

    process(System.in); 

} 

public void process(InputStream is) { 

    byte b[] = new byte[4000]; 
    int bytesRead = is.read(b); 

    ... 

} 
:の入力ストリームは、メソッドに渡されるように

public void process() { 

    byte b[] = new byte[4000]; 
    int bytesRead = System.in.read(b); 

    ... 

} 

あなたはそれを考慮する必要があります

これは同じ動作をしますが、テスト目的のために独自の入力ストリームを使用してビジネスロジックを呼び出すこともできます。

関連する問題