מדריך מהיר ל- java.lang.System

1. סקירה כללית

במדריך זה, נסתכל במהירות על ה- מערכת java.lang בכיתה ותכונותיה ופונקציונליות הליבה שלה.

2. IO

מערכת הוא חלק מ java.lang, ואחת התכונות העיקריות שלה היא לתת לנו גישה לזרמי ה- I / O הסטנדרטיים.

במילים פשוטות, הוא חושף שלושה שדות, אחד לכל זרם:

  • הַחוּצָה
  • לִטְעוֹת
  • ב

2.1. System.out

System.out מצביע על זרם הפלט הסטנדרטי, וחושף אותו כ- PrintStreamואנחנו יכולים להשתמש בו להדפסת טקסט למסוף:

System.out.print ("איזו הודעה מוטמעת");

שימוש מתקדם של מערכת זה להתקשר System.setOut, שבה נוכל להשתמש כדי להתאים אישית את המיקום אליו System.out יכתוב:

// הפניה מחדש לקובץ טקסט System.setOut (PrintStream חדש ("filename.txt"));

2.2. System.err

System.err הוא הרבה כמו System.out. שני התחומים הם מקרים של PrintStream, ושניהם מיועדים להדפסת הודעות למסוף.

אבל System.err מייצג שגיאה סטנדרטית ואנחנו משתמשים בזה במיוחד להפקת הודעות שגיאה:

System.err.print ("הודעת שגיאה מוטמעת כלשהי"); 

קונסולות לעיתים קרובות יעבדו את זרם השגיאה באופן שונה מזרם הפלט.

למידע נוסף, עיין ב PrintStream תיעוד.

2.3. System.in

System.in מצביע על התקן ב, וחושף אותו כ- InputStream, ואנחנו יכולים להשתמש בו לקריאת קלט מהקונסולה.

ובעוד קצת יותר מעורב, אנחנו עדיין יכולים להסתדר:

מחרוזת ציבורית readUsername (int אורך) זורק IOException {בייט [] שם = בתים חדשים [אורך]; System.in.read (שם, 0, אורך); // כברירת מחדל, מהקונסולה תחזיר מחרוזת (שם) חדשה; }

על ידי התקשרות System.in.read, היישום נעצר ומחכה לקלט מהסטנדרט פנימה. מה שלא יהיה הבא אורך בתים יקראו מהזרם ויישמרו במערך הבתים.

כל דבר אחר שהוקלד על ידי המשתמש נשאר בזרם, מחכה לשיחה נוספת ל לקרוא.

כמובן שפעולה ברמה הנמוכה הזו יכולה להיות מאתגרת ומועדת לטעויות, כך שנוכל לנקות אותה קצת BufferedReader:

מחרוזת ציבורית readUsername () זורקת IOException {קורא BufferedReader = BufferedReader חדש (InputStreamReader חדש (System.in)); להחזיר reader.readLine (); }

בהסדר הנ"ל, קריאת שורה יקרא מתוך System.in עד שהמשתמש יכה בחזרה, וזה קצת יותר קרוב למה שאנחנו יכולים לצפות.

שים לב שבכוונה אנו לא סוגרים את הזרם במקרה זה. סגירת התקן ב פירושו שלא ניתן לקרוא אותו במהלך מחזור החיים של התוכנית!

ולבסוף, שימוש מתקדם ב System.in זה להתקשר System.setIn להפנות אותו לאחר InputStream.

3. שיטות שירות

מערכת מספק לנו שיטות רבות שיעזרו לנו בדברים כמו:

  • גישה לקונסולה
  • העתקת מערכים
  • שמירה על תאריך ושעה
  • יציאה מה- JRE
  • גישה למאפייני זמן ריצה
  • גישה למשתני סביבה, ו
  • ניהול איסוף אשפה

3.1. גישה למסוף

Java 1.6 הציגה דרך אחרת של אינטראקציה עם המסוף מאשר פשוט שימוש System.out ו ב באופן ישיר.

אנחנו יכולים לגשת אליו על ידי התקשרות מערכת.קונסולה:

מחרוזת ציבורית readUsername () {Console console = System.console (); להחזיר קונסולה == null? null: console.readLine ("% s", "הזן את שמך:"); }

שים לב כי תלוי במערכת ההפעלה הבסיסית ובאופן שבו אנו מפעילים את Java להפעלת התוכנית הנוכחית, לְנַחֵם אולי יחזור ריק, לכן הקפד תמיד לבדוק לפני השימוש.

עיין בתיעוד המסוף לשימושים נוספים.

3.2. מערכי העתקה

System.arraycopy היא דרך ישנה בסגנון C להעתיק מערך אחד למשנהו.

בעיקר, arraycopy נועד להעתיק מערך שלם אחד למערך אחר:

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

עם זאת, אנו יכולים לציין את מיקום ההתחלה של שני המערכים, כמו גם כמה אלמנטים להעתקה.

לדוגמה, נניח שאנחנו רוצים להעתיק 2 אלמנטים מ א, מתחיל ב א [1] ל ב, מתחיל ב ב [3]:

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

זכרו זאת arraycopy ישליך:

  • NullPointerException אם מערך זה הוא ריק
  • IndexOutOfBoundsException אם העותק מתייחס למערך מעבר לטווח שלו
  • ArrayStoreException אם העותק מביא לאי התאמה בין סוגים

3.3. שמירה על תאריך ושעה

ישנן שתי שיטות הקשורות לזמן מערכת. אחד הוא currentTimeMillis והשני הוא nanoTime.

currentTimeMillis מחזיר את מספר האלפיות השנייה שעברו מאז תקופת יוניקס, שהיא 1 בינואר 1970, 00:00 UTC:

ציבורי ארוך עכשיוPlusOneHour () {להחזיר System.currentTimeMillis () + 3600 * 1000L; } מחרוזת ציבורית nowPrettyPrinted () {החזר תאריך חדש (System.currentTimeMillis ()). toString (); } 

nanoTime מחזירה את הזמן ביחס להפעלת JVM. אנו יכולים לקרוא לזה מספר פעמים כדי לסמן את חלוף הזמן ביישום:

זמן התחלה ארוך = System.nanoTime (); // ... זמן סיום ארוך = System.nanoTime (); assertTrue (endTime - startTime <10000); 

שים לב שמאז nanoTime הוא כל כך גרגר עדין, זה יותר בטוח לעשות endTime - startTime <10000 מאשר endTime <startTime בגלל האפשרות של הצפה מספרית.

3.4. יציאה מהתכנית

אם ברצוננו לצאת מתכנית מהתוכנית המבוצעת כעת, System.exit יעשה את הטריק.

להפעיל יְצִיאָה, עלינו לציין קוד יציאה, שיישלח למסוף או למעטפת שהשיקה את התוכנית.

לפי מוסכמה ב- Unix, סטטוס 0 פירושו יציאה רגילה, בעוד שאינו אפס פירושו שגיאה כלשהי:

אם (שגיאה) {System.exit (1); } אחר {System.exit (0); }

שים לב שעבור רוב התוכניות בימינו, זה יהיה מוזר להתקשר לזה. כאשר נקרא ביישום שרת אינטרנט, למשל, הוא עשוי להוריד את האתר כולו!

3.5. גישה למאפייני זמן ריצה

מערכת מספק גישה למאפייני זמן ריצה עם getProperty.

ואנחנו יכולים לנהל אותם באמצעות setProperty ו clearProperty:

מחרוזת ציבורית getJavaVMVendor () {System.getProperty ("java.vm.vendor"); } System.setProperty ("abckey", "abcvaluefoo"); assertEquals ("abcvaluefoo", System.getProperty ("abckey")); System.clearProperty ("abckey"); assertNull (System.getProperty ("abckey"));

מאפיינים שצוינו באמצעות נגישים דרך getProperty.

אנו יכולים גם לספק ברירת מחדל:

System.clearProperty ("dbHost"); מחרוזת myKey = System.getProperty ("dbHost", "db.host.com"); assertEquals ("db.host.com", myKey);

וגם System.getProperties מספק אוסף של כל מאפייני המערכת:

מאפייני מאפיינים = System.getProperties ();

שממנו אנו יכולים לעשות כל דבר נכסים פעולות:

חלל ציבורי clearAllProperties () {System.getProperties (). clear (); }

3.6. גישה למשתני סביבה

מערכת מספק גישה לקריאה בלבד למשתני סביבה עם getenv.

אם אנחנו רוצים לגשת ל נָתִיב משתנה סביבה, למשל, אנו יכולים לעשות:

מחרוזת ציבורית getPath () {להחזיר System.getenv ("PATH"); }

3.7. ניהול איסוף זבל

בדרך כלל מאמצי איסוף האשפה אטומים לתוכניות שלנו. אולם מדי פעם, אולי נרצה להציע הצעה ישירה ל- JVM.

System.runFinalization היא שיטה המאפשרת לנו להציע ל- JVM להפעיל את שגרת הסיום שלה.

System.gc היא שיטה המאפשרת לנו להציע ל- JVM לנהל את שגרת איסוף האשפה שלה.

מכיוון שהחוזים בשתי השיטות הללו אינם מבטיחים כי ייגמר הגמר או איסוף האשפה, התועלת בהן קטנה.

עם זאת, הם יכולים להיות מיושמים כאופטימיזציה, למשל אומר gc כאשר אפליקציית שולחן עבודה ממוזערת:

חלל חלל ציבוריStateChanged (אירוע WindowEvent) {if (event == WindowEvent.WINDOW_DEACTIVATED) {System.gc (); // אם זה בסופו של דבר פועל, נהדר! }}

למידע נוסף על סיום, עיין במדריך הסופי שלנו.

4. מסקנה

במאמר זה יצא לנו לראות כמה מהתחומים והשיטות מערכת מספק. הרשימה המלאה נמצאת בתיעוד הרשמי של המערכת.

כמו כן, בדוק את כל הדוגמאות במאמר זה ב- Github.