Guida rapida a java.lang.System

1. Panoramica

In questo tutorial, daremo una rapida occhiata alla classe java.lang.System e alle sue caratteristiche e funzionalità di base.

2. IO

Il sistema fa parte di java.lang e una delle sue caratteristiche principali è di darci accesso ai flussi di I / O standard.

In poche parole, espone tre campi, uno per ogni flusso:

  • su
  • err
  • in

2.1. System.out

System.out punta al flusso di output standard, esponendolo come PrintStream , e possiamo usarlo per stampare il testo sulla console:

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

Un utilizzo avanzato di System consiste nel chiamare System.setOut , che possiamo utilizzare per personalizzare la posizione in cui System.out scriverà:

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

2.2. System.err

System.err è molto simile a System.out . Entrambi i campi sono istanze di PrintStream ed entrambi servono per la stampa dei messaggi sulla console.

Ma System.err rappresenta l'errore standard e lo usiamo specificamente per generare messaggi di errore:

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

Le console spesso renderanno il flusso di errore in modo diverso dal flusso di output.

Per ulteriori informazioni, consultare la documentazione di PrintStream .

2.3. System.in

System.in punta allo standard in, esponendolo come InputStream, e possiamo usarlo per leggere l'input dalla console.

E anche se un po 'più coinvolti, possiamo ancora gestire:

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

Chiamando System.in.read , l'applicazione si arresta e attende l'input dallo standard in. Qualunque sia la lunghezza successiva dei byte verrà letto dal flusso e memorizzato nella matrice di byte.

Qualsiasi altra cosa digitata dall'utente rimane nel flusso , in attesa di leggere un'altra chiamata .

Ovviamente, operare a un livello così basso può essere impegnativo e soggetto a errori, quindi possiamo ripulirlo un po 'con BufferedReader :

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

Con la disposizione sopra, readLine leggerà da System.in fino a quando l'utente non preme return, che è un po 'più vicino a quello che potremmo aspettarci.

Nota che in questo caso non chiudiamo lo stream di proposito. Chiusura lo standard in significa che non può essere letto di nuovo per il ciclo di vita del programma!

Infine, un utilizzo avanzato di System.in consiste nel chiamare System.setIn per reindirizzarlo a un InputStream diverso .

3. Metodi di utilità

Il sistema ci fornisce numerosi metodi per aiutarci con cose come:

  • Accesso alla console
  • Copia di array
  • Osservazione di data e ora
  • Uscita dal JRE
  • Accesso alle proprietà di runtime
  • Accesso alle variabili di ambiente e
  • Amministrazione della garbage collection

3.1. Accesso alla console

Java 1.6 ha introdotto un altro modo di interagire con la console rispetto al semplice utilizzo di System.out e in direttamente.

Possiamo accedervi chiamando System.console :

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

Si noti che a seconda del sistema operativo sottostante e di come si avvia Java per eseguire il programma corrente, la console potrebbe restituire null, quindi assicurarsi sempre di controllare prima di utilizzare .

Consulta la documentazione della console per ulteriori utilizzi.

3.2. Copia di array

System.arraycopy è un vecchio modo in stile C di copiare un array in un altro.

Principalmente, arraycopy ha lo scopo di copiare un array completo in un altro array:

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

Tuttavia, possiamo specificare la posizione iniziale per entrambi gli array, nonché il numero di elementi da copiare.

Ad esempio, supponiamo di voler copiare 2 elementi da a , a partire da a [1] a b , a partire da b [3] :

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

Inoltre, ricorda che arraycopy lancerà:

  • NullPointerException se uno degli array è null
  • IndexOutOfBoundsException se la copia fa riferimento a una matrice oltre il suo intervallo
  • ArrayStoreException se la copia risulta in una mancata corrispondenza del tipo

3.3. Data e ora di osservazione

Esistono due metodi relativi al tempo in System . Uno è currentTimeMillis e l'altro è 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 è un metodo che ci permette di suggerire che JVM esegua la sua routine di garbage collection.

Poiché i contratti di questi due metodi non garantiscono l'esecuzione della finalizzazione o della garbage collection, la loro utilità è limitata.

Tuttavia, potrebbero essere esercitati come un'ottimizzazione, ad esempio invocando gc quando un'app desktop viene ridotta a icona:

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

Per ulteriori informazioni sulla finalizzazione, consulta la nostra guida alla finalizzazione.

4. Conclusione

In questo articolo, abbiamo visto alcuni dei campi e dei metodi forniti dal sistema . L'elenco completo è disponibile nella documentazione ufficiale del sistema.

Inoltre, controlla tutti gli esempi in questo articolo su Github.