Rövid útmutató a java.lang.System rendszerhez

1. Áttekintés

Ebben az oktatóanyagban gyorsan megnézzük a java.lang.Rendszer osztály és jellemzői és alapvető funkcionalitása.

2. IO

Rendszer része java.lang, és az egyik fő jellemzője, hogy hozzáférést biztosítson a szabványos I / O folyamokhoz.

Egyszerűen fogalmazva, három mezőt tesz közzé, mindegyik adatfolyamhoz egyet:

  • ki
  • téved
  • ban ben

2.1. System.out

System.out rámutat a szokásos kimeneti adatfolyamra, a-ként kitéve PrintStream, és felhasználhatjuk a szöveg nyomtatására a konzolra:

System.out.print ("néhány inline üzenet");

A. Fejlett használata Rendszer hívni System.setOut, amellyel testre szabhatjuk, hogy melyik hely System.out írni fog:

// Átirányítás a System.setOut (új PrintStream ("filename.txt") fájlba);

2.2. System.err

System.err nagyon hasonlít System.out. Mindkét mező a PrintStream, és mindkettő üzenetek nyomtatására szolgál a konzolra.

De System.err standard hibát jelent, és ezt kifejezetten a hibaüzenetek kimenetére használjuk:

System.err.print ("valami belső hibaüzenet"); 

A konzolok gyakran másképpen jelenítik meg a hibafolyamot, mint a kimeneti adatfolyam.

További információért ellenőrizze a PrintStream dokumentáció.

2.3. System.in

System.in rámutat a szabványra, kitéve annak InputStream, és felhasználhatjuk a konzol bemenetének olvasására.

És bár egy kicsit jobban érintett, mégis kezelhetjük:

public String readUsername (int hossz) dobja az IOException {bájt [] név = új bájt [hossz]; System.in.read (név, 0, hossz); // alapértelmezés szerint a konzolból adja vissza az új karakterláncot (név); }

Hívással Rendszer.olvasva, az alkalmazás leáll, és várja a bemenetet a standardból. Bármi legyen a következő hossz a bájtokat beolvassák a streamből, és a bájt tömbben tárolják.

A felhasználó által begépelt minden más a falon marad, várakozás egy újabb hívásra olvas.

Természetesen az ilyen alacsony szinten történő működés kihívást és hibára hajlamos lehet, ezért egy kicsit megtisztíthatjuk BufferedReader:

public String readUsername () dobja az IOException-t {BufferedReader reader = new BufferedReader (new InputStreamReader (System.in)); visszatérő olvasó.readLine (); }

A fenti elrendezéssel readLine -tól fog olvasni System.in amíg a felhasználó el nem találja a return-et, ami kissé közelebb áll az elvárásokhoz.

Vegye figyelembe, hogy ebben az esetben szándékosan nem zárjuk be az adatfolyamot. A szabvány lezárása ban ben azt jelenti, hogy nem olvasható újra a program életciklusa alatt!

És végül a System.in hívni System.setIn átirányítani egy másikra InputStream.

3. Segédprogram módszerek

Rendszer számos módszert nyújt számunkra, amelyek a következőkben segítenek bennünket:

  • Hozzáférés a konzolhoz
  • Tömbök másolása
  • Dátum és idő figyelése
  • Kilépés a JRE-ből
  • Futásidejű tulajdonságok elérése
  • Hozzáférés a környezeti változókhoz, és
  • A szemétszállítás igazgatása

3.1. Hozzáférés a konzolhoz

A Java 1.6 a konzollal való interakció másik módját mutatta be, mint puszta használatát System.out és ban ben közvetlenül.

Telefonon elérhetjük System.console:

public String readUsername () {Console console = System.console (); visszatérő konzol == null? null: console.readLine ("% s", "Írja be a nevét:"); }

Vegye figyelembe, hogy az alapul szolgáló operációs rendszertől és a Java futtatásának módjától függően az aktuális program futtatásához konzol visszatérhet nulla, ezért mindig ellenőrizze, hogy használja-e.

További felhasználásokért nézze meg a konzol dokumentációját.

3.2. Tömbök másolása

Rendszer.arraycopy egy régi C stílusú módszer az egyik tömb másolására.

Többnyire, tömbmásolat célja egy teljes tömb másolása egy másik tömbbe:

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

Megadhatjuk azonban mindkét tömb kiindulási helyzetét, valamint azt, hogy hány elemet kell másolni.

Tegyük fel például, hogy 2 elemet akarunk lemásolni a, kezdve a [1] nak nek b, kezdve b [3]:

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

Emlékezzen arra is tömbmásolat dobni fog:

  • NullPointerException ha bármelyik tömb az nulla
  • IndexOutOfBoundsException ha a másolat bármelyik tömbre utal a tartományán kívül
  • ArrayStoreException ha a másolat a típus eltérését eredményezi

3.3. Dátum és idő figyelése

Két módszer kapcsolódik az időhöz Rendszer. Az egyik currentTimeMillis a másik pedig az nanoTime.

currentTimeMillis az Unix-korszak óta eltelt ezredmásodpercek számát adja vissza, azaz 1970. január 1. 00:00 UTC:

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

nanoTime visszaadja a JVM indításához viszonyított időt. Többször hívhatjuk, hogy megjelöljük az alkalmazás múlását:

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

Vegye figyelembe, hogy mivel nanoTime olyan finom szemcsés, biztonságosabb megtenni endTime - startTime <10000 mint endTime <startTime a numerikus túlcsordulás lehetősége miatt.

3.4. Kilépés a programból

Ha programozottan ki akarunk lépni az éppen futtatott programból, System.exit fog cselezni.

Felhívni kijárat, meg kell adnunk egy kilépési kódot, amelyet elküldünk a programot elindító konzolra vagy shellre.

A Unixban szokásos módon a 0 állapot normál kilépést jelent, míg a nulla nélküli azt jelenti, hogy hiba történt:

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

Ne feledje, hogy manapság a legtöbb program esetében furcsa lenne ezt hívni. Például, ha egy webkiszolgáló alkalmazásba hívják, az az egész webhelyet lerombolhatja!

3.5. A futásidejű tulajdonságok elérése

Rendszer hozzáférést biztosít a futási tulajdonságokhoz a getProperty.

És kezelhetjük őket setProperty és 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"));

A következőn keresztül megadott tulajdonságok: -D keresztül érhetők el getProperty.

Alapértelmezést is megadhatunk:

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

És System.getProperties a rendszer összes tulajdonságának gyűjteményét biztosítja:

Tulajdonságok tulajdonságok = System.getProperties ();

Amiből bármit megtehetünk Tulajdonságok tevékenységek:

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

3.6. Hozzáférés a környezeti változókhoz

Rendszer csak olvasható hozzáférést biztosít a környezeti változókhoz a getenv.

Ha hozzá akarunk férni a PÁLYA környezeti változó például a következőket tehetjük:

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

3.7. Szemétgyűjtés adminisztrációja

A szemétszedési törekvések általában átláthatatlanok a programjainkkal szemben. Időnként mégis érdemes direkt javaslatot tenni a JVM-nek.

System.runFinalization olyan módszer, amely lehetővé teszi számunkra, hogy javasoljuk, hogy a JVM futtassa véglegesítési rutinját.

System.gc olyan módszer, amely lehetővé teszi számunkra, hogy javasoljuk, hogy a JVM futtassa a szemétszállítás rutinját.

Mivel e két módszerrel kötött szerződések nem garantálják a véglegesítés vagy a szemétszállítás lefolytatását, hasznosságuk csekély.

Ezeket azonban optimalizálásként, mondjuk hivatkozva lehetne gyakorolni gc amikor egy asztali alkalmazás minimalizálódik:

public void windowStateChanged (WindowEvent event) {if (event == WindowEvent.WINDOW_DEACTIVATED) {System.gc (); // ha végül fut, nagyszerű! }}

A véglegesítésről további információt a véglegesítési útmutatónkban talál.

4. Következtetés

Ebben a cikkben megismerkedhettünk néhány területtel és módszerrel Rendszer biztosítja. A teljes lista megtalálható a rendszer hivatalos dokumentációjában.

Nézze meg a cikk összes példáját a Githubon.