Hurtigguide til java.lang.System

1. Oversikt

I denne opplæringen tar vi en rask titt på java.lang.System klasse og dens funksjoner og kjernefunksjonalitet.

2. IO

System er en del av java.lang, og en av hovedfunksjonene er å gi oss tilgang til standard I / O-strømmer.

Enkelt sagt, den utsetter tre felt, ett for hver strøm:

  • ute
  • feil
  • i

2.1. System.out

System.out peker på standard utgangsstrøm, og utsetter den som en PrintStream, og vi kan bruke den til å skrive ut tekst til konsollen:

System.out.print ("noen innebygde meldinger");

En avansert bruk av System er å ringe System.setOut, som vi kan bruke til å tilpasse stedet der System.out vil skrive:

// Viderekoble til en tekstfil System.setOut (ny PrintStream ("filnavn.txt"));

2.2. System.err

System.err er mye som System.out. Begge feltene er forekomster av PrintStream, og begge er for utskrift av meldinger til konsollen.

Men System.err representerer standard feil, og vi bruker den spesifikt til å sende feilmeldinger:

System.err.print ("noen innebygde feilmeldinger"); 

Konsoller gjengir ofte feilstrømmen annerledes enn utgangsstrømmen.

For mer informasjon, sjekk PrintStream dokumentasjon.

2.3. System.in

System.in peker på standarden i, utsetter den som en InputStream, og vi kan bruke den til å lese inngang fra konsollen.

Og mens vi er litt mer involvert, kan vi fortsatt klare:

offentlig String readUsername (int lengde) kaster IOException {byte [] navn = ny byte [lengde]; System.in.read (navn, 0, lengde); // som standard, fra konsollen returnere ny streng (navn); }

Ved å ringe System.in.read, applikasjonen stopper og venter på innspill fra standarden i. Uansett neste lengde byte blir lest fra strømmen og lagret i byte-arrayet.

Alt annet som er skrevet av brukeren, forblir i strømmen, venter på nok en samtale til lese.

Selvfølgelig kan det være utfordrende og feilutsatt å operere på et så lavt nivå, så vi kan rydde opp litt med det BufferedReader:

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

Med ovennevnte ordning, readLine vil lese fra System.in til brukeren treffer retur, noe som er litt nærmere det vi kan forvente.

Merk at vi med vilje ikke lukker strømmen i dette tilfellet. Lukker standarden i betyr at den ikke kan leses igjen i løpet av programmets livssyklus!

Og til slutt, en avansert bruk av System.in er å ringe System.setIn å omdirigere det til et annet InputStream.

3. Verktøymetoder

System gir oss mange metoder for å hjelpe oss med ting som:

  • Få tilgang til konsollen
  • Kopiere matriser
  • Overhold dato og klokkeslett
  • Gå ut av JRE
  • Få tilgang til kjøretidsegenskaper
  • Tilgang til miljøvariabler, og
  • Administrere søppelinnsamling

3.1. Få tilgang til konsollen

Java 1.6 introduserte en annen måte å samhandle med konsollen enn bare å bruke System.out og i direkte.

Vi får tilgang til det ved å ringe System.console:

public String readUsername () {Konsollkonsoll = System.konsoll (); retur konsoll == null? null: console.readLine ("% s", "Skriv inn navnet ditt:"); }

Merk at avhengig av det underliggende operativsystemet og hvordan vi starter Java for å kjøre det nåværende programmet, konsoll kan komme tilbake null, så sørg alltid for å sjekke før du bruker.

Sjekk konsolldokumentasjonen for mer bruk.

3.2. Kopieringsarrayer

System.arraycopy er en gammel C-stil måte å kopiere en matrise til en annen.

For det meste, arraykopi er ment å kopiere en komplett matrise til en annen matrise:

int [] a = {34, 22, 44, 2, 55, 3}; int [] b = ny int [a.lengde]; System.arraycopy (a, 0, b, 0, a.length); assertArrayEquals (a, b); 

Vi kan imidlertid spesifisere startposisjonen for begge matriser, samt hvor mange elementer som skal kopieres.

La oss for eksempel si at vi vil kopiere to elementer fra en, starter på a [1] til b, starter på b [3]:

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

Husk det også arraykopi vil kaste:

  • NullPointerException hvis en av arrayene er null
  • IndexOutOfBoundsException hvis kopien refererer til en matrise utenfor rekkevidden
  • ArrayStoreException hvis kopien resulterer i en type uoverensstemmelse

3.3. Overholdelse av dato og klokkeslett

Det er to metoder relatert til tid i System. En er currentTimeMillis og den andre er nanoTime.

currentTimeMillis returnerer antall millisekunder som har gått siden Unix-epoken, som er 1. januar 1970 12:00 UTC:

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

nanoTime returnerer tiden i forhold til JVM-oppstart. Vi kan kalle det flere ganger for å markere tidens gang i applikasjonen:

lang starttid = System.nanoTime (); // ... lang slutttid = System.nanoTime (); assertTrue (endTime - startTime <10000); 

Merk at siden nanoTime er så finkornet, det er tryggere å gjøre endTime - startTime <10000 enn sluttid <starttid på grunn av muligheten for numerisk overløp.

3.4. Avslutter programmet

Hvis vi programmatisk vil avslutte det nåværende utførte programmet, System.exit vil gjøre susen.

Å påkalle exit, må vi spesifisere en utgangskode som sendes til konsollen eller skallet som startet programmet.

I henhold til konvensjonen i Unix betyr status 0 en normal utgang, mens ikke-null betyr at det oppstod en feil:

hvis (feil) {System.exit (1); } annet {System.exit (0); }

Merk at for de fleste programmer i dag, ville det være rart å trenge å ringe dette. Når det for eksempel kalles inn et webserverprogram, kan det ta ned hele nettstedet!

3.5. Få tilgang til Runtime Properties

System gir tilgang til kjøretidsegenskaper med getProperty.

Og vi kan klare dem med setProperty og klarEiendom:

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

Egenskaper spesifisert via -D er tilgjengelige via getProperty.

Vi kan også tilby en standard:

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

Og System.getProperties gir en samling av alle systemegenskaper:

Egenskaper egenskaper = System.getProperties ();

Fra hvilket vi kan gjøre noe Eiendommer operasjoner:

offentlig ugyldig clearAllProperties () {System.getProperties (). clear (); }

3.6. Få tilgang til miljøvariabler

System gir også skrivebeskyttet tilgang til miljøvariabler med getenv.

Hvis vi vil ha tilgang til STI miljøvariabel, for eksempel, kan vi gjøre:

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

3.7. Administrere søppelinnsamling

Vanligvis er søppelinnsamling ugjennomsiktig for programmene våre. Noen ganger kan det imidlertid være lurt å komme med et direkte forslag til JVM.

System.runFinalization er en metode som lar oss foreslå at JVM kjører sin sluttrutine.

System.gc er en metode som lar oss foreslå at JVM kjører sin søppeloppsamlingsrutine.

Siden kontrakter med disse to metodene ikke garanterer at sluttføring eller søppeloppsamling vil løpe, er deres nytteverdi liten.

Imidlertid kan de utøves som en optimalisering, si påkallende gc når en desktop-app blir minimert:

public void windowStateChanged (WindowEvent event) {if (event == WindowEvent.WINDOW_DEACTIVATED) {System.gc (); // hvis det ender opp med å løpe, flott! }}

For mer informasjon om finalisering, sjekk ut vår finaliseringsguide.

4. Konklusjon

I denne artikkelen fikk vi se noen av feltene og metodene System gir. Den komplette listen finner du i den offisielle systemdokumentasjonen.

Sjekk også ut alle eksemplene i denne artikkelen på Github.


$config[zx-auto] not found$config[zx-overlay] not found