Snelle gids voor java.lang.System

1. Overzicht

In deze zelfstudie bekijken we kort de java.lang.System klasse en zijn kenmerken en kernfunctionaliteit.

2. IO

Systeem is een onderdeel van java.lang, en een van de belangrijkste functies is om ons toegang te geven tot de standaard I / O-streams.

Simpel gezegd, het toont drie velden, één voor elke stream:

  • uit
  • vergist
  • in

2.1. System.out

System.out verwijst naar de standaard uitvoerstroom en stelt deze bloot als een PrintStream, en we kunnen het gebruiken om tekst naar de console af te drukken:

System.out.print ("een inline bericht");

Een geavanceerd gebruik van Systeem is bellen System.setOut, die we kunnen gebruiken om de locatie aan te passen waarnaar System.out zal schrijven:

// Omleiden naar een tekstbestand System.setOut (nieuwe PrintStream ("filename.txt"));

2.2. System.err

System.err lijkt veel op System.out. Beide velden zijn voorbeelden van PrintStream, en beide zijn voor het afdrukken van berichten naar de console.

Maar System.err staat voor standaardfout en we gebruiken dat specifiek om foutmeldingen te genereren:

System.err.print ("een inline foutmelding"); 

Consoles geven de foutstroom vaak anders weer dan de uitvoerstroom.

Raadpleeg het PrintStream documentatie.

2.3. System.in

System.in verwijst naar de standaard in, en stelt het bloot als een InputStream, en we kunnen het gebruiken om invoer van de console te lezen.

En hoewel we wat meer betrokken zijn, kunnen we het nog steeds beheren:

public String readUsername (int length) gooit IOException {byte [] name = new byte [length]; System.in.read (naam, 0, lengte); // standaard, retourneer vanuit de console nieuwe String (naam); }

Door te bellen System.in.read, stopt de applicatie en wacht op input van de standaard in. Wat de volgende stap ook is lengte bytes worden gelezen uit de stream en opgeslagen in de byte-array.

Al het andere dat door de gebruiker wordt getypt, blijft in de stream, wachtend op een ander gesprek naar lezen.

Op dat lage niveau werken kan natuurlijk uitdagend en foutgevoelig zijn, dus we kunnen het een beetje opruimen met BufferedReader:

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

Met de bovenstaande regeling, Lees regel zal voorlezen System.in totdat de gebruiker op Return klikt, wat een beetje dichter bij wat we zouden verwachten.

Merk op dat we in dit geval met opzet de stream niet sluiten. De standaard sluiten in betekent dat het niet opnieuw kan worden gelezen gedurende de levenscyclus van het programma!

En tot slot, een geavanceerd gebruik van System.in is bellen System.setIn om het om te leiden naar een ander InputStream.

3. Hulpprogramma's

Systeem biedt ons tal van methoden om ons te helpen met zaken als:

  • Toegang tot de console
  • Arrays kopiëren
  • Datum en tijd observeren
  • Het verlaten van de JRE
  • Toegang tot runtime-eigenschappen
  • Toegang tot omgevingsvariabelen, en
  • Garbage collection beheren

3.1. Toegang tot de console

Java 1.6 introduceerde een andere manier van interactie met de console dan simpelweg het gebruik van System.out en in direct.

We kunnen er toegang toe krijgen door te bellen System.console:

openbare String readUsername () {Console console = System.console (); return console == null? null: console.readLine ("% s", "Voer uw naam in:"); }

Merk op dat afhankelijk van het onderliggende besturingssysteem en hoe we Java starten om het huidige programma uit te voeren, troosten misschien terugkeren nul, controleer dus altijd voor gebruik.

Bekijk de consoledocumentatie voor meer toepassingen.

3.2. Arrays kopiëren

System.arraycopy is een oude C-stijl manier om de ene array naar de andere te kopiëren.

Meestal, arraycopy is bedoeld om een ​​complete array naar een andere array te kopiëren:

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

We kunnen echter de startpositie voor beide arrays specificeren, evenals hoeveel elementen we moeten kopiëren.

Laten we bijvoorbeeld zeggen dat we 2 elementen willen kopiëren van een, beginnend bij een [1] naar b, beginnend bij b [3]:

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

Onthoud dat ook arraycopy zal gooien:

  • NullPointerException als een van beide array is nul
  • IndexOutOfBoundsException als de kopie verwijst naar een van de arrays buiten zijn bereik
  • ArrayStoreException als de kopie resulteert in een niet-overeenkomend type

3.3. Datum en tijd observeren

Er zijn twee methoden die verband houden met tijd in Systeem. Een is currentTimeMillis en de andere is nanoTime.

currentTimeMillis geeft het aantal milliseconden terug dat is verstreken sinds de Unix Epoch, dat is 1 januari 1970 12:00 AM UTC:

lang nu openbaarPlusOneHour () {return System.currentTimeMillis () + 3600 * 1000L; } public String nowPrettyPrinted () {retourneer nieuwe datum (System.currentTimeMillis ()). toString (); } 

nanoTime geeft de tijd terug ten opzichte van het opstarten van JVM. We kunnen het meerdere keren noemen om het verstrijken van de tijd in de applicatie te markeren:

lange startTime = System.nanoTime (); // ... long endTime = System.nanoTime (); assertTrue (endTime - startTime <10000); 

Merk op dat sinds nanoTime is zo fijnmazig, het is veiliger om te doen endTime - startTime <10000 dan endTime <startTime vanwege de mogelijkheid van numerieke overloop.

3.4. Het programma verlaten

Als we het momenteel uitgevoerde programma programmatisch willen afsluiten, System.exit zal het lukken.

Inroepen Uitgang, moeten we een exitcode specificeren, die naar de console of shell wordt gestuurd die het programma heeft gestart.

Volgens afspraak in Unix betekent een status van 0 een normale exit, terwijl niet-nul betekent dat er een fout is opgetreden:

if (fout) {System.exit (1); } anders {System.exit (0); }

Merk op dat het voor de meeste programma's tegenwoordig vreemd zou zijn om dit te moeten noemen. Wanneer het bijvoorbeeld in een webservertoepassing wordt opgeroepen, kan het de hele site uitschakelen!

3.5. Toegang tot runtime-eigenschappen

Systeem biedt toegang tot runtime-eigenschappen met getProperty.

En we kunnen ze beheren met setProperty en clearProperty:

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

Eigenschappen gespecificeerd via -D zijn toegankelijk via getProperty.

We kunnen ook een standaard bieden:

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

En System.getProperties biedt een verzameling van alle systeemeigenschappen:

Eigenschappen properties = System.getProperties ();

Van waaruit we alles kunnen doen Eigendommen operaties:

openbare leegte clearAllProperties () {System.getProperties (). clear (); }

3.6. Toegang tot omgevingsvariabelen

Systeem biedt ook alleen-lezen toegang tot omgevingsvariabelen met getenv.

Als we toegang willen krijgen tot het PAD omgevingsvariabele, we kunnen bijvoorbeeld doen:

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

3.7. Garbage Collection beheren

De inspanningen voor afvalinzameling zijn doorgaans ondoorzichtig voor onze programma's. Maar af en toe willen we misschien een directe suggestie doen aan de JVM.

System.runFinalization is een methode waarmee we kunnen suggereren dat de JVM zijn afrondingsroutine uitvoert.

System.gc is een methode waarmee we kunnen suggereren dat de JVM zijn garbage collection-routine uitvoert.

Aangezien contracten van deze twee methoden niet garanderen dat de afronding of garbagecollection zal plaatsvinden, is hun bruikbaarheid beperkt.

Ze kunnen echter worden uitgeoefend als een optimalisatie, zeg maar een beroep gc wanneer een desktop-app wordt geminimaliseerd:

openbare ongeldige windowStateChanged (WindowEvent-gebeurtenis) {if (event == WindowEvent.WINDOW_DEACTIVATED) {System.gc (); // als het wordt uitgevoerd, geweldig! }}

Voor meer informatie over het afronden, bekijk onze afrondingsgids.

4. Conclusie

In dit artikel hebben we enkele velden en methoden leren kennen Systeem biedt. De volledige lijst is te vinden in de officiële systeemdocumentatie.

Bekijk ook alle voorbeelden in dit artikel op Github.