Guide rapide de java.lang.System

1. Vue d'ensemble

Dans ce didacticiel, nous examinerons rapidement la classe java.lang.System et ses fonctionnalités et fonctionnalités principales.

2. IO

System fait partie de java.lang , et l'une de ses principales fonctionnalités est de nous donner accès aux flux d'E / S standard.

En termes simples, il expose trois champs, un pour chaque flux:

  • en dehors
  • se tromper
  • dans

2.1. System.out

System.out pointe vers le flux de sortie standard, l'exposant en tant que PrintStream , et nous pouvons l'utiliser pour imprimer du texte sur la console:

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

Une utilisation avancée de System consiste à appeler System.setOut , que nous pouvons utiliser pour personnaliser l'emplacement dans lequel System.out écrira:

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

2.2. System.err

System.err ressemble beaucoup à System.out . Les deux champs sont des instances de PrintStream et les deux sont destinés à l'impression de messages sur la console.

Mais System.err représente une erreur standard et nous l'utilisons spécifiquement pour générer des messages d'erreur:

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

Les consoles rendront souvent le flux d'erreur différemment du flux de sortie.

Pour plus d'informations, consultez la documentation PrintStream .

2.3. System.in

System.in pointe vers le standard in, l'exposant en tant que InputStream, et nous pouvons l'utiliser pour lire les entrées de la console.

Et bien qu'un peu plus impliqué, nous pouvons toujours gérer:

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); }

En appelant System.in.read , l'application s'arrête et attend l'entrée du standard in. Quelle que soit la longueur suivante , les octets seront lus dans le flux et stockés dans le tableau d'octets.

Tout autre élément saisi par l'utilisateur reste dans le flux , en attente d'un autre appel à lire.

Bien sûr, fonctionner à un niveau aussi bas peut être difficile et sujet aux erreurs, nous pouvons donc le nettoyer un peu avec BufferedReader :

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

Avec l'arrangement ci-dessus, readLine lira à partir de System.in jusqu'à ce que l'utilisateur frappe return, ce qui est un peu plus proche de ce à quoi on pourrait s'attendre.

Notez que nous ne fermons délibérément pas le flux dans ce cas. Fermeture de la norme dans les moyens qu'il ne peut pas être lu à nouveau pour le cycle de vie du programme!

Enfin, une utilisation avancée de System.in consiste à appeler System.setIn pour le rediriger vers un autre InputStream .

3. Méthodes utilitaires

System nous fournit de nombreuses méthodes pour nous aider avec des choses comme:

  • Accéder à la console
  • Copie de tableaux
  • Observer la date et l'heure
  • Quitter le JRE
  • Accéder aux propriétés d'exécution
  • Accès aux variables d'environnement, et
  • Administration du ramasse-miettes

3.1. Accéder à la console

Java 1.6 introduit une autre façon d'interagir avec la console que d' utiliser simplement System.out et en directement.

Nous pouvons y accéder en appelant System.console :

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

Notez que selon le système d'exploitation sous-jacent et la façon dont nous lançons Java pour exécuter le programme actuel, la console peut renvoyer null, assurez-vous donc de toujours vérifier avant d'utiliser .

Consultez la documentation de la console pour plus d'utilisations.

3.2. Copie de tableaux

System.arraycopy est une ancienne façon de copier un tableau dans un autre.

La plupart du temps, arraycopy est destiné à copier un tableau complet dans un autre tableau:

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 est une méthode qui nous permet de suggérer que la JVM exécute sa routine de garbage collection.

Étant donné que les contrats de ces deux méthodes ne garantissent pas que la finalisation ou le garbage collection s'exécutera, leur utilité est limitée.

Cependant, ils peuvent être utilisés comme une optimisation, par exemple en invoquant gc lorsqu'une application de bureau est minimisée:

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

Pour en savoir plus sur la finalisation, consultez notre guide de finalisation.

4. Conclusion

Dans cet article, nous avons pu voir certains des champs et méthodes fournis par System . La liste complète se trouve dans la documentation officielle du système.

Consultez également tous les exemples de cet article sur Github.