Java >> Java tutorial >  >> Tag >> java.lang

Hurtig guide til java.lang.System

1. Oversigt

I denne øvelse 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.

Enkelt sagt, det eksponerer tre felter, et for hver strøm:

  • ud
  • fejl
  • i

2.1. System.out

System.out peger på standardoutputstrømmen og eksponerer den som en PrintStream , og vi kan bruge det til at udskrive tekst til konsollen:

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

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

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

2.2. System.err

System.err ligner System.out meget . Begge felter er forekomster af PrintStream, og begge er til at udskrive beskeder til konsollen.

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

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

Konsoler vil ofte gengive fejlstrømmen anderledes end outputstrømmen.

For mere information, tjek PrintStream dokumentation.

2.3. System.in

System.in peger på standarden i, og afslører den som en InputStream, og vi kan bruge det til at læse input fra konsollen.

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

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

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

Alt andet indtastet af brugeren forbliver i strømmen , venter på endnu et opkald for at læse.

Selvfølgelig kan det være udfordrende og fejlbehæftet at arbejde på det lave niveau, så vi kan rydde lidt op med BufferedReader :

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

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

Bemærk, at vi med vilje ikke lukker strømmen i dette tilfælde. Lukker standarden ind betyder, at det ikke kan læses igen i programmets livscyklus!

Og endelig en avanceret brug af System.in er at kalde System.setIn for at omdirigere den til en anden InputStream .

3. Hjælpemetoder

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

  • Adgang til konsollen
  • Kopiering af arrays
  • Overvågning 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 på end blot at bruge System.out og i direkte.

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

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

Bemærk, at afhængigt af det underliggende operativsystem og hvordan vi starter Java for at køre det aktuelle program, konsol kan returnere null, så sørg altid for at tjekke før du bruger .

Se konsoldokumentationen for flere anvendelser.

3.2. Kopiering af arrays

System.arraycopy er en gammel C-stil måde at kopiere et array til et andet.

For det meste arraycopy er beregnet til at kopiere et komplet array til et andet 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);

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

Lad os f.eks. sige, at vi vil kopiere 2 elementer fra a , startende ved a[1] til b , startende ved b[3] :

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

Husk også at arraycopy vil kaste:

  • NullPointerException hvis et af arrays er null
  • IndexOutOfBoundsException hvis kopien refererer til et array uden for dets rækkevidde
  • ArrayStoreException hvis kopien resulterer i en type uoverensstemmelse

3.3. Observation 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 kl. 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-start. Vi kan kalde det flere gange for at markere tidens gang i ansøgningen:

long startTime = System.nanoTime();
// ...
long endTime = 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 på grund af muligheden for numerisk overløb .

3.4. Afslutter programmet

Hvis vi programmæssigt ønsker at afslutte det aktuelt udførte program, System.exit vil gøre tricket.

For at påkalde exit , skal vi angive en exit-kode, som sendes til den konsol eller shell, der lancerede programmet.

Ifølge konventionen i Unix betyder en status på 0 en normal exit, mens ikke-nul betyder, at der opstod en fejl:

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

Bemærk, at for de fleste programmer i dag ville det være mærkeligt at skulle kalde dette. Når f.eks. et webserverprogram kaldes ind, kan det tage hele webstedet ned!

3.5. Adgang til Runtime Properties

System giver adgang til runtime-egenskaber med getProperty .

Og vi kan administrere dem med setProperty og 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"));

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

Vi kan også levere en standard:

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

Og System.getProperties giver en samling af alle systemegenskaber:

Properties properties = System.getProperties();

Hvorfra vi kan lave alle egenskaber operationer:

public void 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 PATH miljøvariabel, for eksempel, kan vi gøre:

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

3.7. Administrere affaldsopsamling

Typisk er affaldsindsamlingsindsatsen uigennemsigtig for vores programmer. Nogle gange kan vi dog komme med et direkte forslag til JVM.

System.runFinalization er en metode, der giver os mulighed for at foreslå, at JVM kører sin færdiggørelsesrutine.

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

Da kontrakter med disse to metoder ikke garanterer, at færdiggørelsen eller indsamlingen af ​​affald vil køre, er deres anvendelighed snæver.

De kunne dog udøves som en optimering, f.eks. ved at påkalde gc når en desktop-app bliver minimeret:

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

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

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.


Java tag