Stručný sprievodca systémom java.lang.System

1. Prehľad

V tomto výučbe sa rýchlo pozrieme na java.lang.System triedy a jej vlastnosti a základné funkcie.

2. IO

Systém je súčasťou java.langa jednou z jeho hlavných funkcií je poskytnúť nám prístup k štandardným vstupno-výstupným tokom.

Jednoducho povedané, vystavuje tri polia, jedno pre každý stream:

  • von
  • omyl
  • v

2.1. System.out

System.out ukazuje na štandardný výstupný prúd a vystavuje ho ako a PrintStreama môžeme ho použiť na tlač textu na konzolu:

System.out.print ("nejaká vložená správa");

Pokročilé použitie Systém je zavolať System.setOut, pomocou ktorého môžeme prispôsobiť umiestnenie System.out napíše:

// Presmerovanie na textový súbor System.setOut (nový PrintStream ("názov súboru.txt"));

2.2. System.err

System.err je veľa ako System.out. Obidve polia sú inštanciami PrintStream, a obe slúžia na tlač správ do konzoly.

ale System.err predstavuje štandardnú chybu a tú konkrétne používame na výstup chybových správ:

System.err.print ("nejaké vložené chybové hlásenie"); 

Konzoly často vykreslia chybový prúd inak ako výstupný prúd.

Ďalšie informácie nájdete na stránke PrintStream dokumentácia.

2.3. System.in

System.in poukazuje na štandard v a vystavuje ho ako InputStream, a môžeme ho použiť na načítanie vstupu z konzoly.

A aj keď sme o niečo viac zainteresovaní, stále môžeme spravovať:

public String readUsername (int dĺžka) vyvolá IOException {byte [] meno = nový bajt [dĺžka]; System.in.read (meno, 0, dĺžka); // štandardne z konzoly vráti nový String (name); }

Volaním System.in.read, aplikácia sa zastaví a čaká na vstup zo štandardu v. Čo bude nasledovať dĺžka bajty sa budú čítať z toku a ukladať sa do bytového poľa.

Čokoľvek iné zadané používateľom zostane v streame, čaká na ďalší hovor na číslo čítať.

Samozrejme, prevádzka na tak nízkej úrovni môže byť náročná a náchylná na chyby, takže to môžeme trochu vyčistiť pomocou BufferedReader:

public String readUsername () hodí IOException {čítač BufferedReader = nový BufferedReader (nový InputStreamReader (System.in)); návrat reader.readLine (); }

S vyššie uvedeným usporiadaním readLine bude čítať od System.in až kým sa používateľ hitom nevráti, čo je o niečo bližšie k tomu, čo by sme mohli čakať.

Upozorňujeme, že v tomto prípade zámerne neuzatvárame prúd. Uzavretie normy v znamená, že ho počas životného cyklu programu nemožno znovu načítať!

A konečne, pokročilé použitie System.in je zavolať System.setIn presmerovať na inú InputStream.

3. Úžitkové metódy

Systém poskytuje nám množstvo metód, ako nám pomôcť:

  • Prístup na konzolu
  • Kopírovacie polia
  • Pozorovanie dátumu a času
  • Opustenie JRE
  • Prístup k vlastnostiam runtime
  • Prístup k premenným prostredia a
  • Správa odvozu odpadu

3.1. Prístup do konzoly

Java 1.6 predstavila iný spôsob interakcie s konzolou ako jednoduché použitie System.out a v priamo.

Dostaneme sa k nej zavolaním System.console:

public String readUsername () {Console console = System.console (); návratová konzola == null? null: console.readLine ("% s", "Zadajte svoje meno:"); }

Upozorňujeme, že v závislosti od základného operačného systému a od toho, ako spúšťame program Java na spustenie aktuálneho programu, konzola sa môže vrátiť nulový, takže pred použitím vždy nezabudnite skontrolovať.

Ďalšie použitie nájdete v dokumentácii ku konzole.

3.2. Kopírovacie polia

System.arraycopy je starý spôsob kopírovania jedného poľa do druhého v štýle C.

Väčšinou polekopia je určený na kopírovanie jedného úplného poľa do iného poľa:

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

Môžeme však určiť začiatočnú pozíciu pre obe polia a tiež to, koľko prvkov treba kopírovať.

Povedzme napríklad, že chceme kopírovať 2 prvky z aso začiatkom o a [1] do bso začiatkom o b [3]:

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

Pamätajte tiež na to polekopia bude hádzať:

  • NullPointerException ak je ktorékoľvek pole nulový
  • IndexOutOfBoundsException ak kópia odkazuje na ktorékoľvek pole mimo jeho rozsahu
  • ArrayStoreException ak je výsledkom kópie nezhoda typu

3.3. Pozorovanie dátumu a času

S časom sú spojené dve metódy Systém. Jeden je currentTimeMillis a druhá je nanoTime.

currentTimeMillis vráti počet milisekúnd uplynulých od epochy Unixu, ktorá je 1. januára 1970 0:00 UTC:

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

nanoTime vráti čas relatívny k spusteniu JVM. Môžeme to nazvať viackrát, aby sme v aplikácii označili plynutie času:

long startTime = System.nanoTime (); // ... long endTime = System.nanoTime (); assertTrue (endTime - startTime <10 000); 

Všimnite si, že od nanoTime je tak jemnozrnný, je to bezpečnejšie endTime - startTime <10 000 než endTime <startTime kvôli možnosti číselného pretečenia.

3.4. Ukončenie programu

Ak chceme programovo ukončiť práve spustený program, System.exit urobí trik.

Vyvolať východ, musíme určiť výstupný kód, ktorý sa pošle na konzolu alebo shell, ktorý spustil program.

Podľa konvencie v Unixe znamená stav 0 normálny výstup, zatiaľ čo nenulový znamená, že došlo k chybe:

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

Upozorňujeme, že pre väčšinu programov v dnešnej dobe by bolo zvláštne, keby ste to museli nazývať. Keď sa napríklad vyvolá aplikácia webového servera, môže zabrať celú stránku!

3.5. Prístup k vlastnostiam runtime

Systém poskytuje prístup k runtime vlastnostiam s getProperty.

A môžeme ich zvládnuť pomocou setProperty a 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"));

Vlastnosti zadané prostredníctvom -D sú prístupné cez getProperty.

Môžeme tiež poskytnúť predvolené:

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

A System.getProperties poskytuje kolekciu všetkých vlastností systému:

Vlastnosti vlastnosti = System.getProperties ();

Z čoho môžeme robiť čokoľvek Vlastnosti operácie:

public void clearAllProperties () {System.getProperties (). clear (); }

3.6. Prístup k premenným prostredia

Systém tiež poskytuje prístup k premenným prostredia iba na čítanie s getenv.

Ak chceme vstúpiť do CESTA premennú prostredia môžeme napríklad urobiť:

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

3.7. Správa zberu odpadu

Úspešné zbery odpadu sú pre naše programy zvyčajne nepriehľadné. Príležitostne však môžeme chcieť podať priamy návrh JVM.

System.runFinalizácia je metóda, ktorá nám umožňuje navrhnúť, aby JVM spustilo svoju finalizačnú rutinu.

System.gc je metóda, ktorá nám umožňuje navrhnúť, aby JVM spustilo svoju rutinu zberu odpadu.

Pretože zmluvy týchto dvoch metód nezaručujú, že bude prebiehať finalizácia alebo odvoz odpadu, ich užitočnosť je malá.

Mohli by sa však uplatniť ako optimalizácia, povedzme pri vyvolaní gc keď sa minimalizuje desktopová aplikácia:

public void windowStateChanged (udalosť WindowEvent) {if (event == WindowEvent.WINDOW_DEACTIVATED) {System.gc (); // ak to nakoniec beží, super! }}

Ďalšie informácie o finalizácii nájdete v našom sprievodcovi finalizáciou.

4. Záver

V tomto článku sme sa oboznámili s niektorými oblasťami a metódami Systém poskytuje. Kompletný zoznam nájdete v oficiálnej dokumentácii systému.

Skontrolujte tiež všetky príklady v tomto článku na stránkach Github.