BufferedReader לעומת קונסולה לעומת סורק ב- Java

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

במאמר זה נלך ללכת על ההבדלים בין BufferedReader, לְנַחֵם, ו סוֹרֵק שיעורים בג'אווה.

כדי לצלול לעומק על כל נושא, אנו ממליצים לעיין במאמרים האישיים שלנו בנושא Java Scanner, I / O Console ב- Java ו- BufferedReader.

2. קלט משתמש

בהתחשב בזרם הבסיס שעבר לבונים, שניהם BufferedReader ו סוֹרֵק כיתות מסוגלות להתמודד עם מגוון רחב יותר של קלט משתמשים, כגון מחרוזת, קובץ, קונסולת מערכת (המחוברת בדרך כלל למקלדת) ושקע.

מצד שני, ה לְנַחֵם class נועד לגשת אך ורק למסוף המערכת מבוסס התווים, אם בכלל, המשויך למכונה הווירטואלית הנוכחית של Java.

בואו נסתכל על ה- BufferedReader בונים, המקבלים תשומות שונות:

BufferedReader br = BufferedReader חדש (StringReader חדש ("Bufferedreader לעומת Console לעומת Scanner in Java")); BufferedReader br = BufferedReader חדש (FileReader חדש ("file.txt")); BufferedReader br = חדש BufferedReader (InputStreamReader חדש (System.in)) שקע שקע = שקע חדש (hostname, portNumber); BufferedReader br = BufferedReader חדש (InputStreamReader חדש (socket.getInputStream ())); 

ה סוֹרֵק בכיתה יכולה לקבל גם תשומות שונות בבניה שלה:

סורק sc = סורק חדש ("Bufferedreader vs Console vs Scanner in Java") Scanner sc = new Scanner (קובץ חדש ("file.txt")); סורק sc = סורק חדש (System.in); שקע שקע = שקע חדש (hostName, portNumber); סורק sc = סורק חדש (socket.getInputStream ());

ה לְנַחֵם הכיתה זמינה רק באמצעות שיחת השיטה:

קונסולת קונסולה = System.console ();

אנא זכור שכאשר אנו משתמשים ב- לְנַחֵם בכיתה, קונסולת המערכת המשויכת ל- JVM אינה זמינה אם אנו מריצים את הקוד בתוך IDE כגון Eclipse או IntelliJ IDEA.

3. פלט משתמש

בניגוד ל BufferedReader ו סוֹרֵק שיעורים, שלא כותבים שום דבר לזרם הפלט, לְנַחֵם בכיתה מציעים כמה שיטות נוחות כמו readPassword (מחרוזת fmt, אובייקט ... args), readLine (מחרוזת fmt, Object ... args), ו printf (פורמט מחרוזת, אובייקט ... טענות), לכתוב את ההנחיה לזרם הפלט של קונסולת המערכת:

מחרוזת firstName = console.readLine ("הזן את השם הפרטי שלך בבקשה:"); console.printf ("ברוך הבא" + שם פרטי);

אז כשאנחנו כותבים תוכנית לאינטראקציה עם קונסולת המערכת, לְנַחֵם class יפשט את הקוד על ידי הסרת מיותרים System.out.println.

4. ניתוח קלט

ה סוֹרֵק בכיתה יכולה לנתח סוגים וחוטים פרימיטיביים באמצעות ביטויים רגולריים.

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

קלט מחרוזת = "קורא חוצץ לעומת קונסולה לעומת סורק"; סורק sc = סורק חדש (קלט) .useDelimiter ("\ s * לעומת \ s *"); System.out.println (sc.next ()); System.out.println (sc.next ()); System.out.println (sc.next ()); sc.close ();

BufferredReader ו לְנַחֵם שיעורים פשוט קוראים את זרם הקלט כפי שהוא.

5. קריאת נתונים מאובטחים

ה לְנַחֵם בכיתה יש שיטות readPassword () ו readPassword (מחרוזת fmt, אובייקט ... טוען) לקרוא את הנתונים המאובטחים עם השבת הדה, כך שהמשתמשים לא יראו מה הם מקלידים:

סיסמת מחרוזת = String.valueOf (console.readPassword ("סיסמה:")); 

BufferedReader ו סוֹרֵק אין יכולת לעשות זאת.

6. חוט בטוח

שיטות הקריאה ב BufferedReader ושיטות הקריאה והכתיבה ב לְנַחֵם כולם מסונכרןואילו אלה ב סוֹרֵק הכיתה לא. אם אנו קוראים את קלט המשתמש בתוכנית מרובת הליכי משנה BufferedReader אוֹ לְנַחֵם תהיה אפשרות טובה יותר.

7. גודל המאגר

גודל המאגר הוא 8 KB BufferedReader בהשוואה ל- 1 KB ב סוֹרֵק מעמד.

בנוסף, אנו יכולים לציין את גודל החיץ בבנאי של הקורא המאגר בכיתה במידת הצורך. זה יעזור כשקוראים את המיתרים הארוכים מתוך קלט המשתמש. לְנַחֵם למחלקה אין חיץ בעת קריאה מקונסולת המערכת, אך יש לו זרם פלט שנאגר לכתיבה למסוף המערכת.

8. שונות

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

8.1. סגירת זרם הקלט

ברגע שניצור את המופע של BufferedReader אוֹ סוֹרֵק, אנחנו צריכים זכרו לסגור אותו על מנת למנוע דליפת זיכרון. אבל זה לא קורה עם לְנַחֵם class - איננו צריכים לסגור את קונסולת המערכת לאחר השימוש.

8.2. טיפול בחריגים

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

9. מסקנה

עכשיו, לאחר שהצהרנו על ההבדלים בין כיתות אלה, בואו נביא כמה כללי אצבע לגבי איזה מהם מתאימים ביותר להתמודד עם מצבים שונים:

  • להשתמש BufferedReader אם עלינו לקרוא מחרוזות ארוכות מקובץ, מכיוון שיש לו ביצועים טובים יותר מ- סוֹרֵק
  • לשקול לְנַחֵם אם אנו קוראים נתונים מאובטחים מקונסולת המערכת ורוצים להסתיר את מה שמקלידים
  • להשתמש סוֹרֵק אם עלינו לנתח את זרם הקלט עם ביטוי רגולרי מותאם אישית
  • סוֹרֵק יהיה מועדף כאשר אנו מתקשרים עם קונסולת המערכת, מכיוון שהיא מציעה שיטות מדויקות לקרוא ולנתח את זרם הקלט. בנוסף, החיסרון בביצועים אינו מהווה בעיה גדולה, כמו ברוב המקרים, ה- הבאXXX השיטות חוסמות ומחכות להזנה ידנית
  • בהקשר בטוח לשרשור, שקול BufferedReader אלא אם כן עלינו להשתמש בתכונות ספציפיות ל- לְנַחֵם מעמד