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.