Kurzanleitung zu java.lang.System

1. Übersicht

In diesem Tutorial werfen wir einen kurzen Blick auf die Klasse java.lang.System und ihre Funktionen und Kernfunktionen.

2. IO

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

Einfach ausgedrückt, werden drei Felder angezeigt, eines für jeden Stream:

  • aus
  • irren
  • im

2.1. System.out

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

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

Eine erweiterte Verwendung von System ist das Aufrufen von System.setOut , mit dem wir den Speicherort anpassen können, an den System.out schreibt:

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

2.2. System.err

System.err ist System.out sehr ähnlich . Beide Felder sind Instanzen von PrintStream und dienen zum Drucken von Nachrichten an die Konsole.

Aber System.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 PrintStream- Dokumentation.

2.3. System.in

System.in verweist auf den Standard in und macht ihn als InputStream verfügbar. Wir können ihn zum Lesen von Eingaben von der Konsole verwenden.

Und obwohl wir ein bisschen mehr involviert sind, können wir es trotzdem 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 von System.in.read stoppt die Anwendung und wartet auf die Eingabe vom Standard in. Unabhängig von der nächsten Länge werden Bytes aus dem Stream gelesen und im Byte-Array gespeichert.

Alles andere, was der Benutzer eingibt, bleibt im Stream und wartet auf einen weiteren Anruf zum Lesen.

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

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

Mit der obigen Anordnung liest readLine aus System.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. Das Schließen des Standards in bedeutet, dass er für den Lebenszyklus des Programms nicht erneut gelesen werden kann!

Und schließlich besteht eine erweiterte Verwendung von System.in darin, System.setIn aufzurufen , um es zu einem anderen InputStream umzuleiten .

3. Dienstprogrammmethoden

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

  • Zugriff auf die Konsole
  • Arrays kopieren
  • Datum und Uhrzeit beobachten
  • JRE verlassen
  • Zugriff auf Laufzeit-Eigenschaften
  • Zugriff auf Umgebungsvariablen und
  • Speicherbereinigung verwalten

3.1. Zugriff auf die Konsole

Java 1.6 führte eine andere Art der Interaktion mit der Konsole ein als die einfache Verwendung von System.out und in .

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

public String readUsername() { Console console = System.console(); return console == null ? null : console.readLine("%s", "Enter your name: "); }

Beachten Sie, dass die Konsole abhängig vom zugrunde liegenden Betriebssystem und davon, wie wir Java starten, um das aktuelle Programm auszuführen, möglicherweise null zurückgibt. Überprüfen Sie dies daher immer, bevor Sie es verwenden .

Weitere Verwendungszwecke finden Sie in der Konsolendokumentation.

3.2. Arrays kopieren

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

In den meisten Fällen soll Arraycopy 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); 

However, we can specify the starting position for both arrays, as well as how many elements to copy.

For example, let's say we want to copy 2 elements from a, starting at a[1] to b, starting at b[3]:

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

Also, remember that arraycopy will throw:

  • NullPointerException if either array is null
  • IndexOutOfBoundsException if the copy references either array beyond its range
  • ArrayStoreException if the copy results in a type mismatch

3.3. Observing Date and Time

There're two methods related to time in System. One is currentTimeMillis and the other is nanoTime.

currentTimeMillis returns the number of milliseconds passed since the Unix Epoch, which is January 1, 1970 12:00 AM UTC:

public long nowPlusOneHour() { return System.currentTimeMillis() + 3600 * 1000L; } public String nowPrettyPrinted() { return new Date(System.currentTimeMillis()).toString(); } 

nanoTime returns the time relative to JVM startup. We can call it multiple times to mark the passage of time in the application:

long startTime = System.nanoTime(); // ... long endTime = System.nanoTime(); assertTrue(endTime - startTime < 10000); 

Note that since nanoTime is so fine-grained, it's safer to do endTime – startTime < 10000 than endTime < startTime due to the possibility of numerical overflow.

3.4. Exiting the Program

If we want to programmatically exit the currently executed program, System.exit will do the trick.

To invoke exit, we need to specify an exit code, which will get sent to the console or shell that launched the program.

By convention in Unix, a status of 0 means a normal exit, while non-zero means some error occurred:

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

Note that for most programs nowadays, it'd be strange to need to call this. When called in a web server application, for example, it may take down the entire site!

3.5. Accessing Runtime Properties

System provides access to runtime properties with getProperty.

And we can manage them with setProperty and clearProperty:

public String getJavaVMVendor() { System.getProperty("java.vm.vendor"); } System.setProperty("abckey", "abcvaluefoo"); assertEquals("abcvaluefoo", System.getProperty("abckey")); System.clearProperty("abckey"); assertNull(System.getProperty("abckey"));

Properties specified via -D are accessible via getProperty.

We can also provide a default:

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

And System.getProperties provides a collection of all system properties:

Properties properties = System.getProperties();

From which we can do any Properties operations:

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

3.6. Accessing Environment Variables

System also provides read-only access to environment variables with getenv.

If we want to access the PATH environment variable, for example, we can do:

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

3.7. Administering Garbage Collection

Typically, garbage collection efforts are opaque to our programs. On occasion, though, we may want to make a direct suggestion to the JVM.

System.runFinalization is a method that allows us to suggest that the JVM run its finalize routine.

System.gc ist eine Methode, mit der wir vorschlagen können, dass die JVM ihre Garbage Collection-Routine 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 von gc, 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 unserer Finalisierungsanleitung.

4. Fazit

In diesem Artikel haben wir einige der Felder und Methoden gesehen, die das System bereitstellt. Die vollständige Liste finden Sie in der offiziellen Systemdokumentation.

Schauen Sie sich auch alle Beispiele in diesem Artikel über Github an.