CodeGym /בלוג Java /Random-HE /קריאה מהמקלדת: "קוראים"
John Squirrels
רָמָה
San Francisco

קריאה מהמקלדת: "קוראים"

פורסם בקבוצה
היי! השיעורים והמשימות ברמה 3 לימדו אותך כיצד להציג דברים על הקונסולה, ובהתנעה בכיוון השני, כיצד לקרוא נתונים מהמקלדת.
קריאה מהמקלדת: "קוראים" - 1
אפילו למדת להשתמש במבנה המורכב הבא כדי להשיג זאת:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
אבל יש שאלה אחת שעדיין לא ענינו עליה.

איך בכלל זה עובד?

במציאות, תוכניות אינן עצמאיות לחלוטין. הם מתקשרים עם תוכנות אחרות, מערכות, אינטרנט וכו'. ב"תקשורת", אנו מתכוונים בעיקר ל"החלפת נתונים". כלומר, הם מקבלים כמה נתונים חיצוניים וגם שולחים נתונים פנימיים של תוכנית לאנשהו. דוגמאות לתוכניות המחליפות נתונים בשפע בחיי היומיום. לדוגמה, אתרים רבים מאפשרים לך להיכנס באמצעות חשבון הפייסבוק או הטוויטר שלך במקום להירשם. במצב זה, שתי תוכניות (למשל טוויטר והאתר שאליו אתה נכנס) מחליפות את הנתונים הדרושים. התוצאה הסופית היא שנכנסת בהצלחה. המילה "זרם" משמשת לתיאור תהליך חילופי הנתונים. מאיפה הגיע השם הזה? מניסיונך, "נחל" עשוי להיות קשור יותר לנהרות ולא לתכנות. זה לא מקרי :) זרם הוא, במהותו, פיסת נתונים זזה. במילים אחרות, בתכנות, לא המים זורמים - אלא נתונים בצורת בתים ותווים. אנו יכולים לקבל פיסות נתונים מזרם נתונים ולאחר מכן להשתמש בהם. שוב, נשתמש באנלוגיית מים/זרימה: אתה יכול לגרוף מים מנהר כדי להכין מרק, לכבות אש או להשקות את הפרחים שלך. זרמים מאפשרים לך לעבוד עם כל מקור נתונים: בין אם האינטרנט, מערכת הקבצים של המחשב שלך או משהו אחר - זה לא משנה. זרמים הם כלי אוניברסלי. הם מאפשרים לתוכנית לקבל נתונים מכל מקום (זרמים קלט) ולשלוח אותם לכל מקום (זרמים פלט). המשימה שלהם זהה: לקחת נתונים ממקום אחד ולשלוח אותם למקום אחר. ישנם שני סוגי זרמים:
  1. זרמי קלט משמשים לקבלת נתונים
  2. זרמי פלט מיועדים לשליחת נתונים.
ב-Java, זרמים אלה מיושמים על ידי מחלקות InputStreamו OutputStream. אבל אפשר לסווג את הזרמים בצורה אחרת. בנוסף לזרמי קלט ופלט, אנו מדברים גם על זרמי בתים וזרמי תווים . המשמעות כאן צריכה להיות ברורה מספיק: זרם בתים שולח מידע כקבוצה של בתים, בעוד שזרם תווים שולח אותו כקבוצה של תווים. בשיעור זה נתעכב על זרמי קלט. אני אשים קישור עם מידע על זרמי פלט בסוף השיעור. אתה יכול לקרוא את זה בעצמך :) עכשיו תסתכל על הקוד הזה:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
כשעברת על השיעורים, לא חשבת שהשורה הזו די מאיימת? :) זה לא יהיה המקרה לאחר שנחקור איך זה עובד. בואו נסדר את הדברים. נתחיל מהסוף. System.inהוא InputStreamאובייקט, מופע של המחלקה עליה דיברנו מוקדם. זהו זרם קלט המקושר להתקן קלט מערכת (המקלדת). אגב, אתה מכיר בעקיפין את הזרם הזה. אחרי הכל, אתה משתמש לעתים קרובות ב"עמית לעבודה" שלו - System.out! הוא זרם הפלטSystem.out של המערכת . הוא משמש לפלט נתונים לקונסולה באמצעות השיטה המועדפת עליך , בה אתה משתמש כל הזמן :) הוא זרם לשליחת נתונים לקונסולה, בעוד הוא מיועד לקבלת נתונים מהמקלדת. הכל פשוט :) מה גם שאנחנו יכולים לקרוא נתונים מהמקלדת בלי המבנה העצום הזה. אנחנו יכולים פשוט לכתוב: ; System.out.println()System.outSystem.inSystem.in.read()
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
למחלקה InputStream(זכור, System.inהיא InputStreamאובייקט) יש read()שיטה המאפשרת לך לקרוא נתונים. יש בעיה אחת: הוא קורא בתים , לא תווים . משעמם להשתמש באותיות באנגלית בלבד אז בואו ננסה לקרוא את התו הסיני "魚" מהמקלדת (פשוט העתק את האות הזו מכאן ותדביק אותה למסוף באמצעות ctrl + v במחשב או Command + v ב- Mac ) . משמעות הדמות הזו היא 'דג' דרך אגב. פלט מסוף: 233 173 154 10 סמל זה וסינים רבים אחרים תופסים 3 בתים בזיכרון המחשב (בניגוד לאותיות לטיניות, שתופסות רק 1 בייט). במקרה זה, 4 בתים נקראים מהזרם: שלושת הראשונים מייצגים את התו "魚", ובייט אחר מייצג שורה חדשה (Enter). בהתאם לכך, System.inבצורתה הבלתי מעוטרת אינה אופציה עבורנו. בני אדם (למעט חריגים נדירים!) לא יודעים לקרוא בתים. אבל InputStreamReaderהכיתה באה להציל! בוא נראה איזו חיה זו.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
אנו עוברים System.inלאובייקט InputStreamReader . שם הכיתה אומר את זה! אנו יוצרים InputStreamReaderאובייקט ומעבירים לו זרם קלט שהוא יקרא ממנו נתונים. במקרה הזה...
new InputStreamReader(System.in)
...אנחנו אומרים לו, "תקרא נתונים מזרם הקלט של המערכת (מהמקלדת)". אבל זה לא התפקיד היחיד שלו! הוא InputStreamReaderלא מקבל רק נתונים מהזרם. זה גם ממיר זרמי בתים לזרמי תווים . במילים אחרות, אינך צריך עוד להמיר את הנתונים מ"אחדים ואפסים" ל"שפה הניתנת לקריאה אנושית". InputStreamreaderעושה הכל בשבילך. כמובן, InputStreamReaderלא מוגבל לקריאת נתונים מהמסוף. הוא יכול לקרוא נתונים גם ממקומות אחרים. לדוגמה, מתוך קובץ:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
כאן אנחנו יוצרים FileInputStream(טעם אחד של InputStream), עוברים בנתיב הקובץ ומעבירים את הזרם עצמו ל- InputStreamReader. כעת הוא יוכל לקרוא נתונים מהקובץ (אם אכן קיים קובץ בנתיב, כמובן). אנו משתמשים גם בשיטה InputStreamReaderשל ​​המחלקה read()לקריאת נתונים (מקור הנתונים לא משנה: הקונסולה, קובץ או מקום אחר). מה ההבדל בין System.in.read()לבין InputStreamReader.read()?\ בוא ננסה שוב לקרוא את התו "魚" עם InputStreamReader. אני מזכיר לך את מה שנקרא בפועל על ידי System.in.read(): 233 173 154 10 ואיך הם InputStreamReaderעושים את אותה עבודה?
public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
פלט קונסולה: 39770 10 ההבדל ניכר מיד. הבית האחרון (המייצג את השורה החדשה) נשאר ללא שינוי (המספר 10), אך התו "魚" הומר לקוד יחיד "39770". זה מה שזה אומר לקרוא דמויות! אם אתה לא מאמין ש-39770 מייצג את האות "魚", קל לשכנע את עצמך :)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 39770;
       System.out.println(x);
   }
}
פלט קונסולה: אבל אם InputStreamReaderהוא כל כך גדול, למה אנחנו צריכים גם BufferedReader? InputStreamReaderיודע לקרוא נתונים ולהמיר בתים לתווים. מה עוד אפשר לבקש? למה עוד קורא? : / התשובה פשוטה מאוד: לביצועים ונוחות גדולים יותר . בואו נתחיל עם ביצועים. כאשר הוא קורא נתונים, הוא משתמש באזור מיוחד הנקרא מאגר, שבו הוא "מאחסן" את התווים שהוא קורא. בסופו של דבר, כאשר יש צורך בתווים אלה בתוכנית, הם יילקחו מהמאגר, ולא ישירות ממקור הנתונים (מקלדת, קובץ וכו'). זה חוסך משאבים רבים. כדי להבין איך זה עובד, דמיינו שליח בחברה גדולה. השליח יושב במשרד ומחכה שמישהו יביא חבילות למשלוח. בכל פעם שהוא מקבל חבילה חדשה, הוא יכול מיד לצאת לדרך. אבל יכולות להיות הרבה חבילות במהלך היום. הוא יצטרך לעשות הרבה נסיעות בין המשרד לכתובות המשלוח. במקום זאת, השליח שם קופסה במשרדו. כל אחד מכניס את החבילות שלו לקופסה. כעת השליח יכול לקחת את הקופסה ברוגע ולעבור מכתובת לכתובת. זה חוסך הרבה זמן, כי הוא לא צריך לחזור כל פעם למשרד. בדוגמה זו, התיבה היא רק מאגר, והמשרד הוא מקור נתונים. לשליח הרבה יותר קל לקחת חבילות מקופסה בודדת בעת ביצוע משלוחים מאשר לחזור למשרד בכל פעם. הוא יחסוך גם בנזין. באופן דומה, בתוכנית זה הרבה פחות עתיר משאבים לקחת נתונים ממאגר מאשר להתייחס למקור הנתונים בכל פעם. כתוצאה מכך, + מהיר יותר מאשר לבד . שקלנו ביצועים. מה לגבי נוחות? היתרון העיקרי הוא שיכול לקרוא נתונים לא רק תו אחד בכל פעם (אם כי הוא יכול לעשות זאת בשיטה שלו), אלא גם שורות שלמות בכל פעם! זה נעשה באמצעות השיטה; BufferedReaderBufferedReaderInputStreamReaderInputStreamReaderBufferedreaderread()readLine()
public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("We read this line from the keyboard:");
       System.out.println(s);
   }
}
פלט מסוף: CodeGym הוא האתר הטוב ביותר ללימוד ג'אווה! קראנו את השורה הזו מהמקלדת: CodeGym הוא האתר הטוב ביותר ללימוד ג'אווה! זה שימושי במיוחד בעת קריאת כמויות גדולות של נתונים. קריאת שורה אחת או שתיים של טקסט תו אחר תו עדיין אפשרית. אבל לקרוא ב"מלחמה ושלום" אות אחת בכל פעם תהיה קצת בעייתית :)

קריאה נוספת:

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION