
.bin.FileOutputStream עם הנתיב המלא, ועליו ObjectOutputStream.byte לגיל, float למשכורת, String לשם מלא ו-int למיקוד.writeByte, writeFloat, writeInt. ל-ObjectOutputStream אין writeString, יש רק writeBytes, שזורקת את הבתים כמו שהם.writeInt, ורק אחר כך את תווי המחרוזת, ואז את המיקוד.ObjectOutputStream (שנפתח אחרון), ואחר כך FileOutputStream.FileInputStream ועליו ObjectInputStream.readByte, readFloat, readInt לאורך המחרוזת.StringBuilder, ולולאה לפי האורך שנקרא, שקוראת בית בודד ב-read, ממירה ל-char ומוסיפה עם append.readInt למיקוד. מרכיבים את הכול למחרוזת details ומציגים. סוגרים קודם את ObjectInputStream ואחר כך את FileInputStream.הטקסט המלא של הדקות הראשונות בהרצאה «Write and Read Binary File» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שהבנו איך קובץ בינארי בנוי, בואו ניקח את אותה הדוגמה שהייתה לנו שבה כתבנו לקובץ טקסט ואז קראנו מקובץ טקסט ונשנה אותה כך שנכתוב כמה דברים לקובץ בינארי ונקרא מהקובץ הבינארי.
הדבר הראשון שאנחנו רוצים לשנות זה את הסיומת כאן מ-txt ל-bin. הדבר הבא שאנחנו רוצים זה להחליף את הקטע קוד שמאפשר לכתוב לקובץ טקסט בכזה שמאפשר לכתוב לקובץ בינארי.
זה יהיה File Output Stream שווה ל-Null וראינו שיש לנו גם Object Output Stream ואנחנו רוצים לבנות Object מה-File Output Stream ולתת לו את ה-Full Path and File Name ומיד אחר כך Object Output Stream ולתת לו את ה-File Stream.
עכשיו, מה שאנחנו רוצים לכתוב זה מספר נתונים שהם קצת שונים אחד מהשני בכדי להבין שאנחנו יכולים לכתוב כל טיפוס נתונים שאנחנו רוצים לתוך קובץ בינארי.
אין שם טקסטים, זה לא שורות שורות כמו שהיה בקובץ טקסט, אבל השאלה זה איך אנחנו בעצם כותבים טיפוסים שונים ואיך אנחנו קוראים את הטיפוסים השונים.
אז בואו ניקח מספר טיפוסים שונים בואו ניקח בית נגיד שזה ה-age ניקח float נניח שזה משכורת בואו נניח שזה 10,650.4 ניקח סטרינג full name זה יהיה כמובן ידידנו מוישה אופניק ניקח int וזה יהיה ה-zip code ובוא נניח שזה 1 עד 5. ניפטר מהקוד הקודם ואם אנחנו עכשיו רוצים את כל הקוד הזה, כל הדאטה הזה לכתוב, אנחנו צריכים להשתמש ב-object output
stream ופשוט to write את הטיפוסים השונים. לדוגמה, write byte זה יהיה ה-age, object write float זה יהיה ה-salary ומה שקורה, ושברגע שאנחנו קוראים לפונקציה write byte, אז היא יודעת שהיא קיבלה מספר והיא כותבת אותו כbyte אחד.
write float תיקח את אותו מספר שהיא קיבלה ותכתוב אותו בדיוק כארבעה בתים שבו הוא בנוי בזיכרון. אבל יש לנו פה קצת בעיה עם סטרינג. Object output stream אין לו write סטרינג יש לו write bytes וbytes מקבלת סטרינג ופשוט זורקת את הבתים as is אבל אנחנו לא יכולים פשוט לבוא ולרשום את הדבר הזה בצורה כזאת
ולאחר מכן write int עם הzip code כי זה לא שהמידע הזה לא ייכתב לקובץ הוא ייכתב אנחנו נראה פה done והכל יהיה בסדר הבעיה היא שאם אתם רוצים לקרוא את המידע שכתבתם, אתם צריכים לדעת בדיוק מה הפורמט של הקובץ הבינארי, בדיוק איזה טיפוסים רשמתם, מה הסדר שלהם ובקיצור מה המידע המדויק שקיים
בקובץ. אז מה הבעיה? אני יודע שכתבתי כאן בית אחד ופה float ופה String ופה Integer. הבעיה היא שאין לנו פונקציה שמסוגלת לקרוא String.
אז אנחנו לא יודעים כמה הגודל של הסטרינג, מה בדיוק הגודל של הסטרינג שרשמנו. אנחנו צריכים לקרוא byte byte או תו תו לשלוף אותם מהקובץ ואנחנו לא באמת יודעים מה הסוף של הסטרינג.
לכן אנחנו צריכים שנייה לפני שאנחנו רושמים את הסטרינג לבוא ל-object output stream.write int ולרשום את הגודל שלה, פול ניים לנקף, ואז כשנקרא את הקובץ נוכל קודם כל לקרוא מה הגודל של הסטרינג, ואז בלולא לקרוא את התווים השונים, כי אין לנו פה כל כך
פונקציות שמסוגלות לעשות את זה בצורה פשוטה יותר. אז בואו ניקח את הפייל OutputStream הזה, נשים אותו פה, נשכפל, הופה, קיבלתי פה עם המשתנה הקאלי והמחלקה ונשכפל את כל זה ואז נסגור גם את ה-object output stream והוא צריך להיסגר ראשון כי הוא נפתח אחרון והנה יש לנו כאן את הקטע קוד שכותב את המידע.
איך אנחנו קוראים את המידע? בשביל לקרוא את המידע אנחנו צריכים File Input Stream ואנחנו צריכים Object Input Stream במקום שני החבריה האלה ניצור מהם אובייקטים File Input Stream יקבל את Full Path End File Name Object Input Stream יקבל את ה-File Input Stream וכעת אנחנו יכולים לגשת ולקרוא את המידע שכתבנו.
כאשר אנחנו קוראים את המידע אנחנו חייבים לעשות את זה בדיוק באותו הסדר שבו המידע כתוב. אז יש לנו קודם כל byte אחד של h ואנחנו פונים ל-object input stream read byte בודד ואז הוא יוכל לקרוא בדיוק את הבית הראשון שיש שם.
לאחר מכן float salary שווה Object input stream read float והנה הוא קורא את ארבעת הבתים הבאים ומחזיר לנו אותם בתצורה של float.
לאחר מכן יש לנו את ה-full name size ו/או length יותר הגיוני וזה יהיה object input stream.read int בודד. נרוץ בלולאה עד full name length. שנייה לפני הלולאה נארגן לעצמנו איזה סטרינג בילדר וזה יהיה הפול ניים.
נקרא בייט אחד על ידי object input stream.read מספיק פונקציית read ואז היא מביאה לנו את הבייט האחד והיחיד שיש שם ואנחנו נהפוך אותו ל-char ולאחר מכן ניגש לפול ניים, הפנד את ה-char שבנינו ובסיום הלולאה יש