PracticU

Text Files

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › Text Files
מילון מושגים:
בינארי - ייצוג מידע בבסיס 2 בעזרת הספרות 0 ו-1. גם קובץ הכולל קוד מכונה ולא טקסט קריא.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
חבילה - אוסף ארוז של קוד, ספריות או קבצים המופץ כיחידה אחת ומותקן בעזרת מנהל חבילות.

Text Files
השיעור מראה איך כותבים טקסט לקובץ באנדרואיד וקוראים אותו בחזרה, כך שמידע ישרוד מעבר להרצה אחת של האפליקציה. קובץ טקסט מכיל רק תווים קריאים, בניגוד לקובץ בינארי.
כתיבה וקריאה
1. נתיב מלא: משתנה fullPathAndFileName מחזיק נתיב וגם שם קובץ: getFilesDir().getAbsolutePath() ועוד /myFile.txt.
2. כתיבה עם FileWriter: יוצרים אובייקט עם הנתיב ומשתמשים ב-write עם מחרוזת. write לא יורדת שורה לבד, ולכן מוסיפים \r\n. נבחרו \r\n לאחידות, כי חלק מהתוכנות (כמו Notepad) דורשות אותם ואחרות מסתפקות ב-\n. אם הקובץ לא קיים הוא נוצר.
3. try, catch ו-finally: קובץ עלול להיות תפוס לכתיבה על ידי מישהו אחר (רק אחד יכול לכתוב בכל רגע), ובקריאה הוא עלול לא להתקיים, ולכן עוטפים ב-try catch ומציגים הודעה. הסגירה נעשית ב-finally: מגדירים את האובייקט כ-null מראש, בודקים שאינו null וסוגרים בתוך try catch משלו.
4. למה לסגור: הכתיבה נעשית ל-buffer, והנתונים נשפכים לקובץ רק כשהוא מתמלא או נסגר. סגירה גם משחררת את הקובץ לשימוש אחרים.
5. קריאה עם FileReader ו-BufferedReader: ב-FileReader קשה לקרוא, כי אפשר לקבל רק תו בודד או מערך בתים. ל-BufferedReader יש readLine, שקוראת שורה ומתאימה לשני סוגי ירידת השורה. בסוף הקובץ היא מחזירה null. סוגרים בסדר הפוך לפתיחה: קודם BufferedReader ואז FileReader.
6. הלולאה: קוראים שורה ראשונה, ואז while כל עוד השורה אינה null. מצרפים כל שורה ל-fileContent עם \n, קוראים את הבאה, ובסוף מסירים את ה-\n האחרון עם substring(0, length - 1).
7. StringBuilder: מחרוזת היא immutable, ו-+= יוצר בכל פעם מחרוזת חדשה שהישנה נשארת לאיסוף ה-garbage collector. לכן עדיף StringBuilder עם append, ולהסרת התו האחרון deleteCharAt(length - 1). אפשר להמיר בחזרה עם toString.
בדיקה ב-DDMS
הקובץ myFile.txt נוצר ב-files של החבילה בגודל 53 בתים. כדי לקרוא אותו במחשב משתמשים ב-pull a file from the device ושומרים לשולחן העבודה. קריאה דרך האפליקציה החזירה בדיוק את הטקסט שנכתב.
כעת אפשר לשמור טקסט בקובץ ולטעון אותו בהרצה הבאה של האפליקציה.
השיעור הבא בקורס: External Storage

פרקי ההרצאה: Text Files

  1. 00:00

    מהו קובץ טקסט

  2. 00:39

    בניית נתיב לקובץ myFile.txt

  3. 01:41

    כתיבה עם FileWriter וטיפול בחריגות

  4. 03:34

    כתיבת שורות ותווי ירידת שורה

  5. 05:36

    Buffer וסגירת הקובץ ב-finally

  6. 08:12

    בדיקת הקובץ ב-DDMS ושליפתו למחשב

  7. 09:44

    קריאה עם FileReader ו-BufferedReader

  8. 11:02

    קריאת שורות עם readLine

תמלול ההרצאה: Text Files

הטקסט המלא של הדקות הראשונות בהרצאה «Text Files» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:22

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

  3. 00:50

    ולראות איך זה מתבצע הדבר הראשון שאנחנו רוצים זה לבנות איזשהו full path and file name שזה איזשהו משתנה שיחזיק לנו את כל הנתיב לקובץ כולל את השם של הקובץ כמובן אחרי הנתיב.

  4. 01:11

    אז אנחנו רוצים פעם אחת להכניס לתוכו את getfilesdir.getabsolutepath ולשרשר לתוכו איזשהו קובץ, כרגע פשוט נעשה את זה בדיוק פה ונקרא לקובץ myfile.txt.

  5. 01:30

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

  6. 01:45

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

  7. 02:06

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

  8. 02:22

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

  9. 02:38

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

  10. 02:52

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

  11. 03:09

    אז בואו כאן, מה שנעשה בתוך ה-catch זה פשוט טוסט, שאומר שיש איזושהי בעיה בכדי לראות אם הכל בסדר או לא. בואו נגדיר Error, נגדיר פה Ex מטיפוס כללי של Exception וניקח את ההודעה ונציג את הטוסט.

  12. 03:32

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

  13. 03:47

    בואו נכתוב Hello, ושימו לב ש-right לא יורדת שורה אוטומטית. זאת אומרת שאם אנחנו באים לפה ומבצעים right נוסף, אז זה יהיה באותה השורה.

  14. 04:00

    בואו נגדיר פה Hello all בצורה כזאת. אם אנחנו רוצים לרדת שורה, יש לנו את הסימן backslash n. בואו נכתוב פה את השורה הבאה בתור. This is a text file example.

  15. 04:18

    עכשיו, יש לנו backslash n ויש לנו backslash r backslash n. אלה שני אפשרויות, שתי אפשרויות לרדת enter, כאשר enter יכול להיות מתואר רק על ידי backslash n או על ידי backslash r ו-backslash n שאלו שני תווים.

  16. 04:38

    קיצור של carriage return line feed או new line. אז במה נכון להשתמש? אז למעשה שניהם יורדים enter, אם אנחנו רוצים להציג את הקובץ באיזשהו נוטפד, אז backslash n לא יספיק עבור הנוטפד.

  17. 04:58

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

  18. 05:12

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

  19. 05:45

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

  20. 06:03

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

  21. 06:15

    עכשיו, הבאפר כמובן לא יתמלא לגמרי אחרי ה-2-3 שורות האלה, אז אם אנחנו נעשה את זה, הקובץ לא באמת ייכתב.

  22. 06:25

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

  23. 06:40

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

  24. 06:55

    בגלל שאנחנו רוצים לסגור את הקובץ גם אם הייתה חריגה וגם אם לא הייתה חריגה, אנחנו צריכים לבצע את הסגירות באזור Finally.

  25. 07:05

    Finally זה אזור שאנחנו יודעים שמתבצע תמיד, בין אם הייתה חריגה ובין אם לא הייתה חריגה. אז מה שמקובל לבצע זה להגדיר כאן Null עבור האובייקט FileWriter ופשוט לבצע פה בדיקה האם FileWriter שונה מ-Null.

  26. 07:24

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

  27. 07:50

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

  28. 08:04

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

  29. 08:30

    אנחנו נמצאים ב-DataData, אנחנו צריכים לגשת ל-Package ובתוך ה-Package יש לנו פה את ה-Files שכרגע אין בו כלום. בואו ניגש ונשים את האמולטור ונלחץ על הלחצן, הנה אנחנו רואים done וכעת אנחנו יכולים לגשת ל-Files ולראות שיש לנו פה myfile.txt עם 53 בתים בתוכו.

  30. 08:59

    איך אנחנו יכולים לקרוא מה כתוב כאן? אז למעשה אין שום יכולת כאן ב-DDMS לקרוא את הקובץ הזה, אבל יש יכולת לשלוף אותו מתוך המכשיר החוצה, כי ה-DDMS רק מראה לנו מה יש בתוך מכשיר אמיתי או בתוך האמולטור.

  31. 09:18

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

  32. 09:29

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

  33. 09:50

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

  34. 10:10

    לצורך קריאת המידע אנחנו צריכים אובייקט מסוג File Reader. בואו נבצע את אותו הטריק של מקודם, נשים בהם נ"ל, ואז ב-finally נסגור אותם.

  35. 10:25

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

  36. 10:52

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

  37. 11:08

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

  38. 11:27

    קבצי טקסט מכילים שורות שורות, זאת אומרת ששורה מסתיימת ב-Enter. Enter יכול להיות או Backslash N או Backslash R Backslash N. ReadLine מסוגלת לקרוא שורה בין אם היא מסתיימת רק ב-Backslash N ובין אם היא מסתיימת ב-Backslash R Backslash N.

  39. 11:44

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

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: Create Directory

ההרצאה הבאה: External Storage

הרצאות קשורות מקורסים אחרים

  • קבצים - Files - חלק 1
  • קבצים - files
  • files ownership
  • יצירת קבצי הגדרות - NodeJS config files

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון