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?
Premere ctrl-D (forse due volte) per chiudere il flusso di input. Se in realtà non chiudi lo stream, non sei su EOF. –
Solo quando l'input termina effettivamente, ad es.'echo abc | java SystemInTest' – zapl
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