Guide rapide sur java.lang.System

Guide rapide sur java.lang.System

1. Vue d'ensemble

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

2. IO

System fait partie dejava.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:

  • out

  • err

  • in

2.1. System.out

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

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

Une utilisation avancée deSystem consiste à appelerSystem.setOut, que nous pouvons utiliser pour personnaliser l'emplacement dans lequelSystem.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 dePrintStream, et tous deux servent à imprimer des messages sur la console.

MaisSystem.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 rendent souvent le flux d'erreur différemment du flux de sortie.

Pour plus d'informations, consultez la documentation dePrintStream.

2.3. System.in

System.in pointe vers le standard in, l'exposant comme unInputStream, et nous pouvons l'utiliser pour lire l'entrée de la console.

Et même si nous sommes un peu plus impliqués, 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 appelantSystem.in.read, l'application s'arrête et attend l'entrée de la norme dans. Quels que soient les octets suivants delength seront lus à partir du flux et stockés dans le tableau d'octets.

Anything else typed by the user stays in the stream, en attente d'un autre appel versread.

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

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

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

Notez que nous ne fermons pas délibérément le flux dans ce cas. Closing the standard inmeans that it cannot be read again for the lifecycle of the program!

Et enfin, une utilisation avancée deSystem.in est d'appelerSystem.setIn pour le rediriger vers un autreInputStream.

3. Méthodes utilitaires

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

  • Accéder à la console

  • Copier des matrices

  • Observer la date et l'heure

  • Quitter la JRE

  • Accéder aux propriétés d'exécution

  • Accéder aux variables d'environnement, et

  • Administration du ramassage des ordures

3.1. Accéder à la console

Java 1.6 a introduit une autre façon d'interagir avec la console que d'utiliser simplementSystem.out etin directement.

Nous pouvons y accéder en appelantSystem.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,console might return null, so always make sure to check before using.

Consultez la documentation deConsole 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);

Cependant, nous pouvons spécifier la position de départ pour les deux tableaux, ainsi que le nombre d'éléments à copier.

Par exemple, disons que nous voulons copier 2 éléments dea, en commençant àa[1] versb, en commençant àb[3]:

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

Souvenez-vous également quearraycopy lancera:

  • NullPointerException si l'un des tableaux estnull

  • IndexOutOfBoundsException si la copie fait référence à l'un des tableaux au-delà de sa plage

  • ArrayStoreException si la copie entraîne une incompatibilité de type

3.3. Date et heure d'observation

Il existe deux méthodes liées au temps enSystem. L'un estcurrentTimeMillis et l'autre estnanoTime.

currentTimeMillis renvoie le nombre de millisecondes écoulées depuis l'époque Unix, qui correspond au 1er janvier 1970 à minuit UTC:

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

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

nanoTime renvoie l'heure relative au démarrage de la JVM. Nous pouvons l'appeler plusieurs fois pour marquer le passage du temps dans l'application:

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

assertTrue(endTime - startTime < 10000);

Notez que puisquenanoTime est si fin,it’s safer to do endTime – startTime < 10000 than endTime < startTime due to the possibility of numerical overflow.

3.4. Quitter le programme

Si nous voulons quitter par programme le programme actuellement exécuté,System.exit fera l'affaire.

Pour invoquerexit, nous devons spécifier un code de sortie, qui sera envoyé à la console ou au shell qui a lancé le programme.

Par convention sous Unix, un statut égal à 0 signifie une sortie normale et une valeur non nulle à une erreur quelconque:

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

Notez que pour la plupart des programmes de nos jours, il serait étrange d’appeler cela. When called in a web server application, for example, it may take down the entire site!

3.5. Accès aux propriétés d'exécution

System permet d'accéder aux propriétés d'exécution avecgetProperty.

Et nous pouvons les gérer avecsetProperty etclearProperty:

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

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

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

Les propriétés spécifiées via-D sont accessibles viagetProperty.

Nous pouvons également fournir un défaut:

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

EtSystem.getProperties fournit une collection de toutes les propriétés système:

Properties properties = System.getProperties();

À partir de laquelle nous pouvons faire toutes les opérationsProperties:

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

3.6. Accès aux variables d'environnement

System fournit également un accès en lecture seule aux variables d'environnement avecgetenv.

Si nous voulons accéder à la variable d'environnementPATH, par exemple, nous pouvons faire:

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

3.7. Administration de la collecte des ordures

En règle générale, les efforts de collecte des déchets sont opaques pour nos programmes. À l'occasion, cependant, nous voudrons peut-être faire une suggestion directe à la JVM.

System.runFinalization est une méthode qui nous permet de suggérer que la JVM exécute sa routine de finalisation.

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 invoquantgc 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 nosfinalize guide.

4. Conclusion

Dans cet article, nous avons pu voir certains des champs et méthodes fournis parSystem. La liste complète se trouve dans lesofficial System documentation.

Consultez également tous les exemples de cet articleover on Github.