PracticU

Write and Read Binary File

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

Write and Read Binary File
איך שומרים לקובץ בינארי כמה נתונים מטיפוסים שונים, ואיך קוראים אותם בחזרה? בשיעור משנים את הדוגמה של קובץ הטקסט כך שתכתוב וקרא קובץ עם סיומת .bin.
כתיבה
1. הזרמים: FileOutputStream עם הנתיב המלא, ועליו ObjectOutputStream.
2. הנתונים: byte לגיל, float למשכורת, String לשם מלא ו-int למיקוד.
3. כתיבה לפי טיפוס: writeByte, writeFloat, writeInt. ל-ObjectOutputStream אין writeString, יש רק writeBytes, שזורקת את הבתים כמו שהם.
4. הבעיה עם מחרוזת: בלי לדעת את אורכה אי אפשר לדעת איפה היא נגמרת בקריאה. לכן קודם כותבים את האורך ב-writeInt, ורק אחר כך את תווי המחרוזת, ואז את המיקוד.
5. סגירה: קודם ObjectOutputStream (שנפתח אחרון), ואחר כך FileOutputStream.
קריאה
1. הזרמים: FileInputStream ועליו ObjectInputStream.
2. הסדר: חייבים לקרוא בדיוק באותו סדר ובאותם טיפוסים שבהם כתבנו: readByte, readFloat, readInt לאורך המחרוזת.
3. קריאת המחרוזת: StringBuilder, ולולאה לפי האורך שנקרא, שקוראת בית בודד ב-read, ממירה ל-char ומוסיפה עם append.
4. סיום: readInt למיקוד. מרכיבים את הכול למחרוזת details ומציגים. סוגרים קודם את ObjectInputStream ואחר כך את FileInputStream.
בדיקה
כתיבה וקריאה החזירו את כל הנתונים. הקובץ ב-DDMS אינו קריא ב-Notepad, פרט למחרוזות. הוא לא מוצפן, אלא פשוט קשה לקריאה.
שימו לב
הפורמט אינו מתועד בקובץ עצמו: מי שקורא חייב לדעת בדיוק אילו טיפוסים נכתבו ובאיזה סדר.
כעת אפשר לכתוב ולקרוא כמה טיפוסים שונים בקובץ בינארי, ולצמצם את גודל הנתונים.
השיעור הבא בקורס: Object Serialization

פרקי ההרצאה: Write and Read Binary File

  1. 00:00

    מעבר מקובץ טקסט לקובץ בינארי

  2. 00:41

    פתיחת FileOutputStream ו-ObjectOutputStream

  3. 01:19

    נתונים מטיפוסים שונים לכתיבה

  4. 02:19

    כתיבת byte, float ו-int

  5. 03:35

    בעיית קריאת מחרוזת מקובץ בינארי

  6. 04:18

    כתיבת אורך המחרוזת לפני התווים

  7. 05:17

    קריאה עם FileInputStream ו-ObjectInputStream

  8. 06:41

    קריאת המחרוזת בלולאה עם StringBuilder

תמלול ההרצאה: Write and Read Binary File

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

  1. 00:01

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

  2. 00:19

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

  3. 00:37

    זה יהיה File Output Stream שווה ל-Null וראינו שיש לנו גם Object Output Stream ואנחנו רוצים לבנות Object מה-File Output Stream ולתת לו את ה-Full Path and File Name ומיד אחר כך Object Output Stream ולתת לו את ה-File Stream.

  4. 01:08

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

  5. 01:22

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

  6. 01:33

    אז בואו ניקח מספר טיפוסים שונים בואו ניקח בית נגיד שזה ה-age ניקח float נניח שזה משכורת בואו נניח שזה 10,650.4 ניקח סטרינג full name זה יהיה כמובן ידידנו מוישה אופניק ניקח int וזה יהיה ה-zip code ובוא נניח שזה 1 עד 5. ניפטר מהקוד הקודם ואם אנחנו עכשיו רוצים את כל הקוד הזה, כל הדאטה הזה לכתוב, אנחנו צריכים להשתמש ב-object output

  7. 02:19

    stream ופשוט to write את הטיפוסים השונים. לדוגמה, write byte זה יהיה ה-age, object write float זה יהיה ה-salary ומה שקורה, ושברגע שאנחנו קוראים לפונקציה write byte, אז היא יודעת שהיא קיבלה מספר והיא כותבת אותו כbyte אחד.

  8. 02:45

    write float תיקח את אותו מספר שהיא קיבלה ותכתוב אותו בדיוק כארבעה בתים שבו הוא בנוי בזיכרון. אבל יש לנו פה קצת בעיה עם סטרינג. Object output stream אין לו write סטרינג יש לו write bytes וbytes מקבלת סטרינג ופשוט זורקת את הבתים as is אבל אנחנו לא יכולים פשוט לבוא ולרשום את הדבר הזה בצורה כזאת

  9. 03:18

    ולאחר מכן write int עם הzip code כי זה לא שהמידע הזה לא ייכתב לקובץ הוא ייכתב אנחנו נראה פה done והכל יהיה בסדר הבעיה היא שאם אתם רוצים לקרוא את המידע שכתבתם, אתם צריכים לדעת בדיוק מה הפורמט של הקובץ הבינארי, בדיוק איזה טיפוסים רשמתם, מה הסדר שלהם ובקיצור מה המידע המדויק שקיים

  10. 03:47

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

  11. 04:02

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

  12. 04:19

    לכן אנחנו צריכים שנייה לפני שאנחנו רושמים את הסטרינג לבוא ל-object output stream.write int ולרשום את הגודל שלה, פול ניים לנקף, ואז כשנקרא את הקובץ נוכל קודם כל לקרוא מה הגודל של הסטרינג, ואז בלולא לקרוא את התווים השונים, כי אין לנו פה כל כך

  13. 04:45

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

  14. 05:22

    איך אנחנו קוראים את המידע? בשביל לקרוא את המידע אנחנו צריכים File Input Stream ואנחנו צריכים Object Input Stream במקום שני החבריה האלה ניצור מהם אובייקטים File Input Stream יקבל את Full Path End File Name Object Input Stream יקבל את ה-File Input Stream וכעת אנחנו יכולים לגשת ולקרוא את המידע שכתבנו.

  15. 06:06

    כאשר אנחנו קוראים את המידע אנחנו חייבים לעשות את זה בדיוק באותו הסדר שבו המידע כתוב. אז יש לנו קודם כל byte אחד של h ואנחנו פונים ל-object input stream read byte בודד ואז הוא יוכל לקרוא בדיוק את הבית הראשון שיש שם.

  16. 06:27

    לאחר מכן float salary שווה Object input stream read float והנה הוא קורא את ארבעת הבתים הבאים ומחזיר לנו אותם בתצורה של float.

  17. 06:42

    לאחר מכן יש לנו את ה-full name size ו/או length יותר הגיוני וזה יהיה object input stream.read int בודד. נרוץ בלולאה עד full name length. שנייה לפני הלולאה נארגן לעצמנו איזה סטרינג בילדר וזה יהיה הפול ניים.

  18. 07:14

    נקרא בייט אחד על ידי object input stream.read מספיק פונקציית read ואז היא מביאה לנו את הבייט האחד והיחיד שיש שם ואנחנו נהפוך אותו ל-char ולאחר מכן ניגש לפול ניים, הפנד את ה-char שבנינו ובסיום הלולאה יש

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

ההרצאה הקודמת: Compare Text to Binary

ההרצאה הבאה: Object Serialization

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

  • Write File
  • Read Committed / UnCommitted
  • Begin Write Tests
  • Importing File

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

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