Kurzanleitung zu java.lang.System

Kurzanleitung zu java.lang.System

1. Überblick

In diesem Tutorial werfen wir einen kurzen Blick auf die Klassejava.lang.Systemowie ihre Funktionen und Kernfunktionen.

2. IO

System ist ein Teil vonjava.lang, und eine seiner Hauptfunktionen besteht darin, uns Zugriff auf die Standard-E / A-Streams zu gewähren.

Einfach ausgedrückt, macht es drei Felder verfügbar, eines für jeden Stream:

  • out

  • err

  • in

2.1. System.out

System.out zeigt auf den Standardausgabestream und macht ihn alsPrintStream verfügbar. Wir können ihn verwenden, um Text auf der Konsole zu drucken:

System.out.print("some inline message");

Eine erweiterte Verwendung vonSystem besteht darin,System.setOut aufzurufen, mit der wir den Speicherort anpassen können, an denSystem.out schreiben wird:

// Redirect to a text file
System.setOut(new PrintStream("filename.txt"));

2.2. System.err

System.err istSystem.out sehr ähnlich. Beide Felder sind Instanzen vonPrintStream, und beide dienen zum Drucken von Nachrichten an die Konsole.

AberSystem.err stellt einen Standardfehler dar und wir verwenden diesen speziell, um Fehlermeldungen auszugeben:

System.err.print("some inline error message");

Konsolen rendern den Fehlerstrom häufig anders als den Ausgabestream.

Weitere Informationen finden Sie in der Dokumentation zuPrintStream.

2.3. System.in

System.in zeigt auf den Standard in und macht ihn alsInputStream, verfügbar. Wir können ihn zum Lesen von Eingaben von der Konsole verwenden.

Und obwohl wir ein bisschen mehr zu tun haben, können wir dennoch Folgendes schaffen:

public String readUsername(int length) throws IOException {
    byte[] name = new byte[length];
    System.in.read(name, 0, length); // by default, from the console
    return new String(name);
}

Durch Aufrufen vonSystem.in.read stoppt die Anwendung und wartet auf die Eingabe vom Standard in. Was auch immer die nächstenlength Bytes sind, werden aus dem Stream gelesen und im Byte-Array gespeichert.

Anything else typed by the user stays in the stream und wartet auf einen weiteren Aufruf vonread.

Natürlich kann es schwierig und fehleranfällig sein, auf diesem niedrigen Niveau zu arbeiten, daher können wir es mitBufferedReader ein wenig bereinigen:

public String readUsername() throws IOException {
    BufferedReader reader = new BufferedReader(
      new InputStreamReader(System.in));
    return reader.readLine();
}

Mit der obigen Anordnung liestreadLine vonSystem.in, bis der Benutzer die Eingabetaste drückt, was etwas näher an dem liegt, was wir erwarten könnten.

Beachten Sie, dass wir den Stream in diesem Fall absichtlich nicht schließen. Closing the standard inmeans that it cannot be read again for the lifecycle of the program!

Und schließlich besteht eine erweiterte Verwendung vonSystem.in darin,System.setIn aufzurufen, um es auf ein anderesInputStream umzuleiten.

3. Dienstprogrammmethoden

System bietet uns zahlreiche Methoden, um uns bei folgenden Dingen zu helfen:

  • Auf die Konsole zugreifen

  • Arrays kopieren

  • Datum und Uhrzeit einhalten

  • Beenden der JRE

  • Auf Runtime-Eigenschaften zugreifen

  • Zugriff auf Umgebungsvariablen und

  • Garbage Collection verwalten

3.1. Zugriff auf die Konsole

Java 1.6 führte eine andere Art der Interaktion mit der Konsole ein, als einfachSystem.out undin direkt zu verwenden.

Wir können darauf zugreifen, indem wirSystem.console aufrufen:

public String readUsername() {
    Console console = System.console();

    return console == null ? null :
      console.readLine("%s", "Enter your name: ");
}

Beachten Sie, dass abhängig vom zugrunde liegenden Betriebssystem und wie wir Java starten, um das aktuelle Programm auszuführen,console might return null, so always make sure to check before using.

Weitere Verwendungszwecke finden Sie in der Dokumentation zuConsole.

3.2. Arrays kopieren

System.arraycopy ist eine alte C-Methode zum Kopieren eines Arrays in ein anderes.

Meistens sollarraycopy ein vollständiges Array in ein anderes Array kopieren:

int[] a = {34, 22, 44, 2, 55, 3};
int[] b = new int[a.length];

System.arraycopy(a, 0, b, 0, a.length);
assertArrayEquals(a, b);

Wir können jedoch die Startposition für beide Arrays sowie die Anzahl der zu kopierenden Elemente angeben.

Angenommen, wir möchten 2 Elemente vona kopieren, beginnend beia[1] bisb, beginnend beib[3]:

System.arraycopy(a, 1, b, 3, 2);
assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);

Denken Sie auch daran, dassarraycopy werfen wird:

  • NullPointerException, wenn eines der Arraysnull ist

  • IndexOutOfBoundsException, wenn die Kopie auf ein Array verweist, das außerhalb seines Bereichs liegt

  • ArrayStoreException, wenn die Kopie zu einer Typinkongruenz führt

3.3. Datum und Uhrzeit beobachten

Es gibt zwei zeitbezogene Methoden inSystem. Einer istcurrentTimeMillis und der andere istnanoTime.

currentTimeMillis gibt die Anzahl der Millisekunden zurück, die seit der Unix-Epoche am 1. Januar 1970 um 00:00 Uhr UTC vergangen sind:

public long nowPlusOneHour() {
    return System.currentTimeMillis() + 3600 * 1000L;
}

public String nowPrettyPrinted() {
    return new Date(System.currentTimeMillis()).toString();
}

nanoTime gibt die Zeit relativ zum JVM-Start zurück. Wir können es mehrmals aufrufen, um den Ablauf der Zeit in der Anwendung zu markieren:

long startTime = System.nanoTime();
// ...
long endTime = System.nanoTime();

assertTrue(endTime - startTime < 10000);

Beachten Sie, dassnanoTime, dananoTime so feinkörnig ist.

3.4. Beenden des Programms

Wenn wir das aktuell ausgeführte Programm programmgesteuert beenden möchten, reichtSystem.exit aus.

Umexit aufzurufen, müssen Sie einen Exit-Code angeben, der an die Konsole oder Shell gesendet wird, die das Programm gestartet hat.

Gemäß der Konvention in Unix bedeutet der Status 0 einen normalen Exit, während ein Fehler ungleich Null bedeutet, dass ein Fehler aufgetreten ist:

if (error) {
    System.exit(1);
} else {
    System.exit(0);
}

Beachten Sie, dass es heutzutage für die meisten Programme seltsam ist, dies aufrufen zu müssen. When called in a web server application, for example, it may take down the entire site!

3.5. Zugriff auf Laufzeit-Eigenschaften

System bietet mitgetProperty Zugriff auf Laufzeit-Eigenschaften.

Und wir können sie mitsetProperty undclearProperty verwalten:

public String getJavaVMVendor() {
    System.getProperty("java.vm.vendor");
}

System.setProperty("abckey", "abcvaluefoo");
assertEquals("abcvaluefoo", System.getProperty("abckey"));

System.clearProperty("abckey");
assertNull(System.getProperty("abckey"));

Über-D angegebene Eigenschaften sind übergetProperty zugänglich.

Wir können auch einen Standard festlegen:

System.clearProperty("dbHost");
String myKey = System.getProperty("dbHost", "db.host.com");
assertEquals("db.host.com", myKey);

UndSystem.getProperties bietet eine Sammlung aller Systemeigenschaften:

Properties properties = System.getProperties();

Von wo aus wir alleProperties-Operationen ausführen können:

public void clearAllProperties() {
    System.getProperties().clear();
}

3.6. Zugriff auf Umgebungsvariablen

System bietet auch schreibgeschützten Zugriff auf Umgebungsvariablen mitgetenv.

Wenn wir beispielsweise auf die UmgebungsvariablePATHzugreifen möchten, können wir Folgendes tun:

public String getPath() {
    return System.getenv("PATH");
}

3.7. Garbage Collection verwalten

In der Regel sind die Bemühungen zur Müllabfuhr für unsere Programme undurchsichtig. Gelegentlich möchten wir der JVM jedoch einen direkten Vorschlag machen.

System.runFinalization ist eine Methode, mit der wir vorschlagen können, dass die JVM ihre Finalisierungsroutine ausführt.

System.gc ist eine Methode, mit der wir vorschlagen können, dass die JVM ihre Speicherbereinigungsroutine ausführt.

Da Verträge dieser beiden Methoden nicht garantieren, dass die Finalisierung oder Speicherbereinigung ausgeführt wird, ist ihre Nützlichkeit gering.

Sie können jedoch als Optimierung ausgeführt werden, z. B. als Aufruf vongc, wenn eine Desktop-App minimiert wird:

public void windowStateChanged(WindowEvent event) {
    if ( event == WindowEvent.WINDOW_DEACTIVATED ) {
        System.gc(); // if it ends up running, great!
    }
}

Weitere Informationen zur Finalisierung finden Sie in unserenfinalize guide.

4. Fazit

In diesem Artikel haben wir einige der Felder und Methoden gesehen, dieSystem bereitstellt. Die vollständige Liste finden Sie inofficial System documentation.

Schauen Sie sich auch alle Beispiele in diesem Artikelover on Github an.