2016-07-22 13 views
0

Die Methode read() ist in der Klasse InputStream als abstrakt deklariert. Aber wir können mit der Tastatur System.in.read() lesen.Worauf bezieht sich System.in standardmäßig?

Meine Frage ist, dass "in" eine Referenz der InputStream Klasse ist. Um die Methode read() zu verwenden, muss man sich auf eine Unterklasse von InputStream beziehen.

Auf welche Klasse bezieht sich 'in' standardmäßig? Können wir einen Code schreiben, um eine Antwort auf diese Frage zu finden?

+0

** Es bezieht sich auf den ** Standardeingabe. Siehe [Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#in), das * hinzufügt. Dieser Stream ist bereits geöffnet und bereit, Eingabedaten zu liefern. Dieser Stream entspricht normalerweise der Tastatureingabe oder einer anderen Eingabequelle, die von der Hostumgebung oder dem Benutzer angegeben wird. * –

Antwort

3

Um Ihre Frage zu beantworten: Ja, Sie können die Klasse der System.in Code durch das Schreiben erfahren.

Dies ist die Anwendung die Sie suchen:

public class SystemDotInClassFinder { 
    public static void main(String[] args) { 
     System.out.println(System.in.getClass().getName()); 
    } 
} 

Ausführen dieses Skript erzeugt:

java.io.BufferedInputStream 
1

Wie Sie in den Quellcode sehen kann, ist es ein BufferedInputStream:

private static void initializeSystemClass() { 
    props = new Properties(); 
    initProperties(props); 
    VM.saveAndRemoveProperties(props); 
    lineSeparator = props.getProperty("line.separator"); 
    Version.init(); 
    FileInputStream arg = new FileInputStream(FileDescriptor.in); 
    FileOutputStream arg0 = new FileOutputStream(FileDescriptor.out); 
    FileOutputStream arg1 = new FileOutputStream(FileDescriptor.err); 
    setIn0(new BufferedInputStream(arg)); 
    setOut0(newPrintStream(arg0, props.getProperty("sun.stdout.encoding"))); 
    setErr0(newPrintStream(arg1, props.getProperty("sun.stderr.encoding"))); 
    loadLibrary("zip"); 
    Terminator.setup(); 
    VM.initializeOSEnvironment(); 
    Thread arg2 = Thread.currentThread(); 
    arg2.getThreadGroup().add(arg2); 
    setJavaLangAccess(); 
    VM.booted(); 
} 
Verwandte Themen