2012-10-23 8 views
6

Eventuali duplicati:
Writing data to System.inIn Java come assegnare valore a System.in?

Sappiamo che System.in (standard input) è collegato alla console. Quindi ogni volta che scriviamo in console verrà inviato a questo stream. Ma esiste un modo per passare valore a questo input standard senza entrare dalla console, ad esempio System.in = "ABCD". Voglio solo imitare mentre il valore passa dalla console.

+0

cosa vuoi fare esattamente con quello? Suono qualcosa di strano. In realtà leggi ciò che c'è in System.in e NON lo assegni. –

risposta

13

Sì, c'è. Utilizzare System.setIn(InputStream in).

È possibile fornire qualsiasi sottotipo di InputStream così, quindi se si vuole fornire un valore specifico, è possibile utilizzare il StringBufferInputStream, in questo modo:

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

+1 sebbene sia dichiarato come 'public finale statico InputStream' –

+0

ma non funziona per più thread. Ho usato System.setIn (s) in un thread e nell'altro thread sto usando Scanner.nextLine(). Quando passo il valore a System.SetIn da un thread non ha alcun effetto sull'altro thread in cui viene utilizzato Scanner.nextLine(). C'è un modo per farlo funzionare su più thread? – Angom

+2

Mentre lo leggevo, hai già creato uno 'Scanner' nel secondo thread, * prima * modifica' System.in' nel primo thread. Lo scanner contiene un riferimento al 'InputStream' fornito ad esso durante la creazione. Se dovessi chiamare 'System.setIn (...)' dal primo thread * prima * creando 'Scanner' nel secondo thread, dovrebbe funzionare senza problemi. – mthmulders

0

Penso che invece di avere il tuo metodo direttamente l'accesso System.in:

public void process() { 

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

    ... 

} 

si dovrebbe fattore che in modo che un flusso di input viene passato al metodo:

public void run() { 

    process(System.in); 

} 

public void process(InputStream is) { 

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

    ... 

} 

Questo ti dà lo stesso comportamento, ma ti permette di invocare la logica di business con flussi di input del tuo stesso progetto anche a scopo di test.

Problemi correlati