מדריך למחלקת Java FileReader

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

כמו שהשם מרמז, FileReader הוא מחלקת Java שמקלה על קריאת תוכן הקובץ.

במדריך זה נלמד את הרעיון הבסיסי של קוֹרֵא ואיך נוכל להשתמש ב- FileReader מחלקה לביצוע פעולות קריאה בזרם תווים בג'אווה.

2. קוֹרֵא יסודות

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

זה מעלה שאלות כמו "מי עושה את המשקל הכבד מאחורי המעמד הזה?"

כדי לענות על שאלה זו, עלינו להבין את המושג וההיררכיה של ה- קוֹרֵא בכיתה בג'אווה.

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

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

באופן טבעי, כל היישומים של קוֹרֵא על המעמד ליישם את כל השיטות המופשטות, כלומר לקרוא() ו סגור(). יתר על כן, רוב היישומים עוקפים גם שיטות תורשתיות אחרות כדי לתת פונקציונליות נוספת או ביצועים טובים יותר.

2.1. מתי להשתמש ב- FileReader

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

FileReader יורש את הפונקציונליות שלו מ- InputStreamReader, שהוא א קוֹרֵא יישום שנועד לקרוא בתים מזרם קלט כתווים.

בואו נראה את ההיררכיה הזו בהגדרות הכיתה:

מחלקה ציבורית InputStreamReader מרחיב קורא {} מחלקה ציבורית FileReader מרחיב InputStreamReader {}

באופן כללי, אנו יכולים להשתמש ב- InputStreamReader לקריאת תווים מכל מקור קלט.

עם זאת, כשמדובר בקריאת טקסט מקובץ, באמצעות InputStreamReader יהיה כמו לחתוך תפוח בחרב. כמובן שהכלי הנכון יהיה סכין, וזה בדיוק מה FileReader מבטיח.

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

3. קריאת קובץ טקסט עם FileReader

בואו נעבור בתרגיל קידוד של קריאת דמויות מתוך HelloWorld.txt קובץ באמצעות FileReader למשל.

3.1. ליצור FileReader

כחוג נוחות, FileReader מציע שלושה בונים עמוסים מדי באמצעותו ניתן לאתחל קורא שיכול לקרוא מקובץ כמקור קלט.

בואו נסתכל על הבונים הבאים:

FileReader ציבורי (מחרוזת קובץ שם) זורק FileNotFoundException {סופר (FileInputStream חדש (fileName)); } FileReader ציבורי (קובץ קובץ) זורק FileNotFoundException {סופר (FileInputStream חדש (קובץ)); } FileReader ציבורי (FileDescriptor fd) {super (FileInputStream חדש (fd)); }

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

FileReader fileReader = FileReader חדש (נתיב);

3.2. קריאת דמות יחידה

לאחר מכן, בואו ניצור readAllCharactersOneByOne (), שיטה לקריאת תווים מהקובץ בזה אחר זה:

מחרוזת סטטית ציבורית readAllCharactersOneByOne (קורא קורא) זורק IOException {StringBuilder content = new StringBuilder (); int nextChar; בעוד ((nextChar = reader.read ())! = -1) {content.append ((char) nextChar); } להחזיר String.valueOf (תוכן); }

כפי שניתן לראות מהקוד לעיל, אנו השתמשו ב-לקרוא() שיטה בלולאה לקריאת תווים בזה אחר זה עד להחזרתו -1כלומר אין יותר דמויות לקרוא.

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

@Test ציבורי בטל givenFileReader_whenReadAllCharacters_thenReturnsContent () זורק IOException {String expectText = "שלום עולם!"; קובץ קובץ = קובץ חדש (FILE_PATH); נסה (FileReader fileReader = FileReader חדש (קובץ)) {String content = FileReaderExample.readAllCharactersOneByOne (fileReader); Assert.assertEquals (expectText, content); }}

3.3. קריאת מערך דמויות

אנו יכולים אפילו לקרוא מספר תווים בבת אחת באמצעות התורשתי קרא (char cbuf [], int off, int len) שיטה:

מחרוזת סטטית ציבורית readMultipleCharacters (קורא קורא, אורך int) זורק IOException {char [] חיץ = char חדש [אורך]; int charactersRead = reader.read (חיץ, 0, אורך); אם (charactersRead! = -1) {להחזיר מחרוזת חדשה (חיץ, 0, charactersRead); } אחר {להחזיר ""; }}

יש הבדל עדין בערך ההחזר של לקרוא() כשמדובר בקריאת מספר תווים במערך. ה ערך החזרה כאן הוא מספר התווים שנקראו או -1 אם הקורא הגיע לסוף זרם הקלט.

לאחר מכן, בואו לבדוק את נכונות הקוד שלנו:

@Test ציבור בטל givenFileReader_whenReadMultipleCharacters_thenReturnsContent () זורק IOException {String expectText = "שלום"; קובץ קובץ = קובץ חדש (FILE_PATH); נסה (FileReader fileReader = FileReader חדש (קובץ)) {String content = FileReaderExample.readMultipleCharacters (fileReader, 5); Assert.assertEquals (expectText, content); }}

4. מגבלות

ראינו את זה FileReader class מסתמך על קידוד תווי המערכת המוגדר כברירת מחדל.

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

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

BufferedReader in = BufferedReader חדש (fileReader);

5. מסקנה

במדריך זה למדנו על מושגי היסוד של א קוֹרֵא ואיך FileReader עושה את זה פשוט לבצע פעולות קריאה בקובצי טקסט אם כי כמה דוגמאות.

כמו תמיד, קוד המקור השלם להדרכה זמין ב- GitHub.