JavaRush /בלוג Java /Random-HE /תרגל עבודה עם השיעורים BufferedReader ו-InputStreamReader...

תרגל עבודה עם השיעורים BufferedReader ו-InputStreamReader

פורסם בקבוצה
שלום! ההרצאה היום תתחלק לשני חלקים. נחזור על כמה מהנושאים הישנים שכבר נגענו בהם בעבר, ונראה כמה תכונות חדשות :) תרגל עבודה עם השיעורים BufreredReader ו-InputStreamReader - 1נתחיל עם הראשון. החזרה היא אם הלמידה :) כבר השתמשת בשיעור כזה כמו BufferedReader. אני מקווה שעדיין לא שכחת את הפקודה הזו:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
לפני קריאה נוספת, נסו לזכור על מה System.in, InputStreamReader, BufferedReaderאחראי כל רכיב ( ) ולמה הם צריכים. קרה? אם לא, אל תדאג :) אם בשלב זה שכחת משהו, קרא שוב את ההרצאה הזו המוקדשת לקוראים. בואו נזכור בקצרה מה כל אחד מהם יכול לעשות. System.inהוא שרשור לקבלת נתונים מהמקלדת. באופן עקרוני, כדי ליישם את ההיגיון של קריאת הטקסט, אחד יספיק לנו. אבל, כפי שאתה זוכר, System.inזה יכול לקרוא רק בייטים, לא תווים:
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
אם נריץ את הקוד הזה ונזין את האות "Y" בקונסולה, הפלט יהיה כך:

Й
208
153
10
תווים קיריליים תופסים 2 בתים בזיכרון, המוצגים על המסך (והמספר 10 הוא ייצוג בתים של מעבר שורה, כלומר לחיצה על Enter). קריאת בתים היא תענוג כזה, כך שהשימוש בו System.inבצורתו הטהורה יהיה לא נוח. על מנת לקרוא אותיות קיריליות (ולא רק) המובנות לכולם, אנו משתמשים 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);
       }
   }
}
אם נזין את אותה האות "Y" למסוף, התוצאה הפעם תהיה שונה:

Й
1049
10
InputStreamReaderהמיר את שני הקריאה בתים (208, 153) למספר בודד 1049. זוהי קריאה לפי תווים. 1049 מתאים לאות "Y", אותה ניתן לאמת בקלות:
public class Main {

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

       char x = 1049;
       System.out.println(x);
   }
}
פלט מסוף:

Й
ובכן, באשר ל- BufferedReader'a (ובאופן כללי - BufferedAnything), מחלקות מאוחסנות משמשות כדי לייעל את הביצועים. גישה למקור נתונים (קובץ, קונסולה, משאב באינטרנט) היא פעולה יקרה למדי מבחינת ביצועים. לכן, כדי לצמצם את מספר השיחות מסוג זה, BufferedReaderהוא קורא וצובר נתונים במאגר מיוחד, משם נוכל לקבל אותם מאוחר יותר. כתוצאה מכך, מספר השיחות למקור הנתונים מצטמצם פי כמה ואף עשרות מונים! תכונה נוספת של BufferedReader'a והיתרון שלו על רגיל InputStreamReader' היא השיטה השימושית ביותר 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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
תרגל עבודה עם השיעורים BufreredReader ו-InputStreamReader - 2כמובן BufferedReaderשזהו מנגנון מאוד גמיש ומאפשר לעבוד לא רק עם המקלדת. אתה יכול לקרוא נתונים, למשל, ישירות מהאינטרנט על ידי העברת כתובת האתר הנדרשת לקורא:
public class URLReader {
   public static void main(String[] args) throws Exception {

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
אתה יכול לקרוא נתונים מקובץ על ידי העברת הנתיב אליו:
public class Main {
   public static void main(String[] args) throws Exception {

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

החלפה של System.out

עכשיו בואו נסתכל על אפשרות מעניינת אחת שלא נגענו בה בעבר. כפי שאתה בוודאי זוכר, Systemישנם שני שדות סטטיים בכיתה - System.inו System.out. אחים תאומים אלה הם אובייקטים במחלקת חוטים. System.in- שיעור מופשט InputStream. כיתה . System.out_ PrintStreamעכשיו נדבר ספציפית על System.out. אם ניכנס לקוד המקור של המחלקה System, נראה את זה:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
אז, System.outרק משתנה מחלקה סטטית רגילהSystem . אין בו קסם :) המשתנה outשייך למחלקה PrintStream. הנה שאלה מעניינת: מדוע בעת ביצוע קוד, System.out.println()הפלט מופיע בקונסולה ולא במקום אחר? והאם אפשר לשנות את זה איכשהו? לדוגמה, אנו רוצים לקרוא נתונים מהמסוף ולכתוב אותם לקובץ טקסט. האם ניתן ליישם איכשהו היגיון כזה מבלי להשתמש בשיעורי קורא וכותבים נוספים, אלא פשוט באמצעות System.out? עדיין ככל האפשר :) ולמרות שהמשתנה System.outמוגדר על ידי משנה final, אנחנו עדיין יכולים לעשות את זה! תרגל עבודה עם השיעורים BufreredReader ו-InputStreamReader - 3אז מה אנחנו צריכים בשביל זה? ראשית , אנו זקוקים לאובייקט מחלקה חדש PrintStreamבמקום הנוכחי. האובייקט הנוכחי שמותקן במחלקה Systemכברירת מחדל לא מתאים לנו: הוא מצביע על המסוף. עלינו ליצור קובץ חדש שיצביע על קובץ טקסט כ"יעד" לנתונים שלנו. שנית , עליך להבין כיצד להקצות ערך חדש למשתנה System.out. אתה לא יכול פשוט לעשות את זה ככה, כי זה מסומן final. נתחיל מהסוף. המחלקה Systemמכילה בדיוק את השיטה שאנו צריכים - setOut(). הוא לוקח אובייקט כקלט PrintStreamומגדיר אותו כנקודת הפלט. בדיוק מה שאנחנו צריכים! כל מה שנותר הוא ליצור את האובייקט PrintStream. זה גם קל לעשות:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
הקוד כולו ייראה כך:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
כתוצאה מכך, השורה הראשונה תיכתב לקובץ טקסט, והשנייה תוצא למסוף :) אתה יכול להעתיק את הקוד הזה ל-IDE שלך ולהפעיל אותו. בפתיחת קובץ הטקסט תראו שהשורה הנדרשת נכתבה שם בהצלחה :) בכך מסתיימת ההרצאה. היום נזכרנו איך עובדים עם זרמים וקוראים, נזכרנו במה הם שונים זה מזה ולמדנו על תכונות חדשות System.outשהשתמשנו בהן כמעט בכל שיעור :) נתראה בהרצאות הבאות!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION