2016-06-10 14 views
6

So che System.in della classe System è un'istanza di una sottoclasse concreta di InputStream perché il metodo read() di InputStream è astratto e System.in deve sovrascrivere questo metodo. Secondo il documento sul metodo read() di InputStream:confusione sul comportamento del metodo read() di System.in in Java

public int read astratta() throws IOException

Legge il prossimo byte di dati dal flusso di input. Il byte del valore viene restituito come int nell'intervallo compreso tra 0 e 255. Se non è disponibile alcun byte perché è stata raggiunta la fine del flusso, viene restituito il valore -1. Questo metodo blocca fino a quando i dati di input non sono disponibili, viene rilevata la fine del flusso o viene generata un'eccezione.
Una sottoclasse deve fornire un'implementazione di questo metodo.

Resi:
il byte successivo di dati o -1 se viene raggiunta la fine del flusso.

Tiri:
IOException - se si verifica un errore I/O.

Il metodo read() deve restituire -1 se viene raggiunta la fine del flusso. La mia domanda è, quando il System.in.read() restituirà -1?

Di seguito viene riportato il codice di esempio:

import java.io.*; 

class SystemInTest{ 
    public static void main(String[] args) throws IOException{ 
     InputStream in = System.in; 
     //InputStream in = new FileInputStream("h.txt"); 

     int ch = 0; 
     while((ch = in.read()) != -1){ 
      System.out.println(ch); 
     } 
    } 
} 

eseguire questo codice, e digitare "abc" seguito da un "Enter", il risultato è (sotto Linux):

97 
98 
99 
10 

Poi il l'applicazione è bloccata e attende un altro input. Ma ho pensato che l'istruzione nel ciclo while "ch = in.read()" dovrebbe continuare a funzionare e restituire -1 dopo aver letto il carattere di terminazione di riga e aver stampato 10 sulla console. In tal caso, l'applicazione deve essere chiusa. Ma è bloccato.

Come confronto, se rimuovi il commento dalla riga commentata, utilizzando un file il cui contenuto è "abc \ n" come flusso di input di byte, l'applicazione termina come aspettativa poiché viene restituito -1.

È proprio vero che System.in.read() non restituisce mai -1? In tal caso, perché l'implementazione del metodo read() in System.in è diversa con altre sottoclassi di InputStream come FileInputStream?

+0

Premere ctrl-D (forse due volte) per chiudere il flusso di input. Se in realtà non chiudi lo stream, non sei su EOF. –

+2

Solo quando l'input termina effettivamente, ad es.'echo abc | java SystemInTest' – zapl

+0

Ciò che suggerisci dovrebbe impedire a qualsiasi programma di leggere più di una riga dalla riga di comando. Il flusso non è chiuso. Aspetta solo che tu inserisca i prossimi personaggi. -1 verrà restituito se si utilizza 'java MyClass

risposta

1

Il flusso di input non ha dimensioni fisse in modo che il programma stia inserendo il ciclo infinito e chiedendo l'input più e più volte. Tuttavia, il file h.txt ha dimensioni fisse, quindi mentre viene interrotto.

4

La pressione di significa solo che hai terminato una riga, non significa che hai completato un intero "file".

Come si termina un file dipende dal sistema operativo. Su Linux, è Ctrl+D, che è possibile utilizzare in molti programmi per uscirli (invece di digitare exit o quit). Su Windows, è Ctrl+Z.