Hurtig guide til java.lang.System

1. Oversigt

I denne tutorial tager vi et hurtigt kig på java.lang.System klasse og dens funktioner og kernefunktionalitet.

2. IO

System er en del af java.lang, og en af ​​dens hovedfunktioner er at give os adgang til standard I / O-streams.

Kort sagt udsætter den tre felter, et for hver stream:

  • ud
  • fejle
  • i

2.1. System.out

System.out peger på standardudgangsstrømmen og udsætter den som en PrintStream, og vi kan bruge den til at udskrive tekst til konsollen:

System.out.print ("nogle indbyggede meddelelser");

En avanceret brug af System er at ringe System.setOut, som vi kan bruge til at tilpasse den placering, til hvilken System.out vil skrive:

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

2.2. System.err

System.err er meget ligesom System.out. Begge felter er forekomster af PrintStream, og begge er til udskrivning af meddelelser til konsollen.

Men System.err repræsenterer standardfejl, og vi bruger det specifikt til at udsende fejlmeddelelser:

System.err.print ("nogle indbyggede fejlmeddelelser"); 

Konsoller gengiver ofte fejlstrømmen anderledes end outputstrømmen.

For mere information, se PrintStream dokumentation.

2.3. System.in

System.in peger på standarden i og udsætter den for en InputStream, og vi kan bruge det til at læse input fra konsollen.

Og mens vi er lidt mere involverede, kan vi stadig klare:

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

Ved at ringe System.in.read, applikationen stopper og venter på input fra standarden i. Uanset den næste længde bytes læses fra strømmen og gemmes i byte-arrayet.

Alt andet, der er skrevet af brugeren, forbliver i strømmen, venter på endnu et opkald til Læs.

Selvfølgelig kan det være udfordrende og fejlbehæftet at operere på et så lavt niveau, så vi kan rense det lidt op med BufferedReader:

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

Med ovenstående arrangement, readLine vil læse fra System.in indtil brugeren rammer retur, hvilket er lidt tættere på, hvad vi kunne forvente.

Bemærk, at vi bevidst ikke lukker strømmen i dette tilfælde. Lukning af standarden i betyder, at det ikke kan læses igen i programmets livscyklus!

Og endelig en avanceret brug af System.in er at ringe System.setIn at omdirigere det til et andet InputStream.

3. Værktøjsmetoder

System giver os adskillige metoder til at hjælpe os med ting som:

  • Adgang til konsollen
  • Kopiering af arrays
  • Overholdelse af dato og klokkeslæt
  • Afslutter JRE
  • Adgang til runtime-egenskaber
  • Adgang til miljøvariabler og
  • Administration af affaldsindsamling

3.1. Adgang til konsollen

Java 1.6 introducerede en anden måde at interagere med konsollen end blot at bruge System.out og i direkte.

Vi kan få adgang til det ved at ringe System.console:

public String readUsername () {Console console = System.console (); returnere konsol == null? null: console.readLine ("% s", "Indtast dit navn:"); }

Bemærk, at afhængigt af det underliggende operativsystem og hvordan vi starter Java til at køre det aktuelle program, konsol kan vende tilbage nul, så sørg altid for at tjekke inden brug.

Tjek konsoldokumentationen for flere anvendelser.

3.2. Kopieringsarrays

System.arraycopy er en gammel C-stil måde at kopiere en matrix til en anden.

For det meste, arraykopi er beregnet til at kopiere et komplet array til et andet array:

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

Vi kan dog specificere startpositionen for begge arrays samt hvor mange elementer der skal kopieres.

Lad os for eksempel sige, at vi vil kopiere 2 elementer fra -en, starter ved a [1] til b, starter ved b [3]:

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

Husk også det arraykopi vil kaste:

  • NullPointerException hvis begge matrixer er nul
  • IndexOutOfBoundsException hvis kopien refererer til en matrix uden for dens rækkevidde
  • ArrayStoreException hvis kopien resulterer i en type uoverensstemmelse

3.3. Overholdelse af dato og klokkeslæt

Der er to metoder relateret til tid i System. Den ene er currentTimeMillis og den anden er nanoTime.

currentTimeMillis returnerer antallet af millisekunder, der er gået siden Unix-epoken, som er 1. januar 1970 12:00 UTC:

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

nanoTime returnerer tiden i forhold til JVM-opstart. Vi kan kalde det flere gange for at markere tidens gang i applikationen:

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

Bemærk, at siden nanoTime er så finkornet, det er mere sikkert at gøre endTime - startTime <10000 end endTime <startTime på grund af muligheden for numerisk overløb.

3.4. Afslutter programmet

Hvis vi programmatisk vil afslutte det aktuelt udførte program, System.exit vil gøre tricket.

At påberåbe sig Afslut, skal vi angive en udgangskode, som sendes til konsollen eller shell, der startede programmet.

Ved konvention i Unix betyder status 0 en normal udgang, mens ikke-nul betyder, at der opstod en fejl:

hvis (fejl) {System.exit (1); } andet {System.exit (0); }

Bemærk, at det for de fleste programmer i dag er underligt at skulle ringe til dette. Når det f.eks. Kaldes i en webserverapplikation, kan det tage hele webstedet ned!

3.5. Adgang til Runtime Properties

System giver adgang til runtime-egenskaber med getProperty.

Og vi kan klare dem med setProperty og klar ejendom:

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

Egenskaber specificeret via -D er tilgængelige via getProperty.

Vi kan også tilbyde en standard:

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

Og System.getProperties giver en samling af alle systemegenskaber:

Egenskaber egenskaber = System.getProperties ();

Hvorfra vi kan gøre noget Ejendomme operationer:

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

3.6. Adgang til miljøvariabler

System giver også skrivebeskyttet adgang til miljøvariabler med getenv.

Hvis vi vil have adgang til STI miljøvariabel, for eksempel kan vi gøre:

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

3.7. Administration af affaldsindsamling

Typisk er skraldindsamlingsindsatsen uigennemsigtig for vores programmer. Men lejlighedsvis vil vi måske komme med et direkte forslag til JVM.

System.runFinalization er en metode, der giver os mulighed for at foreslå, at JVM kører sin afsluttende rutine.

System.gc er en metode, der giver os mulighed for at foreslå, at JVM kører sin skraldopsamlingsrutine.

Da kontrakter med disse to metoder ikke garanterer, at færdiggørelse eller affaldsindsamling løber, er deres anvendelighed snæver.

De kunne dog udøves som en optimering, siger påberåbt gc når en desktop-app bliver minimeret:

public void windowStateChanged (WindowEvent event) {if (event == WindowEvent.WINDOW_DEACTIVATED) {System.gc (); // hvis det ender med at køre, fantastisk! }}

For mere information om færdiggørelse, se vores finaliseringsvejledning.

4. Konklusion

I denne artikel fik vi at se nogle af felterne og metoderne System giver. Den komplette liste kan findes i den officielle systemdokumentation.

Tjek også alle eksemplerne i denne artikel på Github.


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