logo

Java.io.ObjectOutputStream Class ב-Java | סט 1

ObjectOutputStream כותב סוגי נתונים פרימיטיביים וגרפים של אובייקטי Java ל-OutputStream. ניתן לקרוא את האובייקטים (ליצור מחדש) באמצעות ObjectInputStream. ניתן לבצע אחסון מתמשך של אובייקטים על ידי שימוש בקובץ עבור הזרם. 

  • ניתן לכתוב לזרמים רק אובייקטים התומכים בממשק java.io.Serializable. המחלקה של כל אובייקט הניתן לסידרה מקודדת, כולל שם המחלקה והחתימה של המחלקה, ערכי השדות והמערכים של האובייקט וסגירת כל אובייקט אחר שמופנה מהאובייקטים הראשוניים.
  • לעתים קרובות נעשה שימוש ב-Java ObjectOutputStream יחד עם Java ObjectInputStream. ה-ObjectOutputStream משמש לכתיבת אובייקטי Java וה-ObjectInputStream משמש לקריאת האובייקטים שוב. 

בונים:   

    protected ObjectOutputStream() :ספק דרך עבור תת-מחלקות שמיישמות מחדש לחלוטין את ObjectOutputStream שלא יצטרכו להקצות נתונים פרטיים רק בשימוש על ידי יישום זה של ObjectOutputStream.ObjectOutputStream(OutputStream out):יוצר ObjectOutputStream שכותב ל-OutputStream שצוין. 

שיטות:   



    מוגן void annotateClass(Class cl):תת-מחלקות עשויות ליישם שיטה זו כדי לאפשר אחסון נתוני מחלקות בזרם. כברירת מחדל שיטה זו לא עושה כלום. השיטה המתאימה ב-ObjectInputStream היא resolveClass. שיטה זו נקראת פעם אחת בדיוק עבור כל מחלקה ייחודית בזרם. שם הכיתה והחתימה כבר נכתבו לזרם. שיטה זו עשויה לעשות שימוש חופשי ב-ObjectOutputStream כדי לשמור כל ייצוג של המחלקה שנראה לה מתאים (לדוגמה את הבייטים של קובץ המחלקה). שיטת resolveClass בתת המחלקה המתאימה של ObjectInputStream חייבת לקרוא ולהשתמש בכל הנתונים או האובייקטים שנכתבו על ידי annotateClass. 
  Syntax :  protected void annotateClass(Class cl) throws IOException   Parameters:   cl - the class to annotate custom data for   Throws:   IOException 
Java
//Java program demonstrating ObjectOutputStream methods //illustrating annotateClass(Class cl) method import java.io.*; class ObjectOutputStreamDemo extends ObjectOutputStream {  public ObjectOutputStreamDemo(OutputStream out) throws IOException  {  super(out);  }    public static void main(String[] args) throws IOException  ClassNotFoundException   {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStreamDemo oot = new ObjectOutputStreamDemo(fout);  Character c = 'A';    //illustrating annotateClass(Class cl) method  oot.annotateClass(Character.class);    //Write the specified object to the ObjectOutputStream  oot.writeObject(c);    //flushing the stream  oot.flush();    //closing the stream  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);  System.out.print(oit.readObject());  oit.close();  } } 

פלט:  

A
    מוגן void annotateProxyClass(Class cl):תת-מחלקות עשויות ליישם שיטה זו כדי לאחסן נתונים מותאמים אישית בזרם יחד עם מתארים עבור מחלקות פרוקסי דינמיות. שיטה זו נקראת פעם אחת בדיוק עבור כל מתאר מחלקות פרוקסי ייחודי בזרם. יישום ברירת המחדל של שיטה זו ב- ObjectOutputStream לא עושה כלום.
    השיטה המתאימה ב-ObjectInputStream היא resolveProxyClass. עבור תת-מחלקה נתונה של ObjectOutputStream שעוקפת את השיטה הזו, השיטה resolveProxyClass בתת-המחלקה המתאימה של ObjectInputStream חייבת לקרוא את כל הנתונים או האובייקטים שנכתבו על ידי annotateProxyClass. 
  Syntax :  protected void annotateProxyClass(Class cl) throws IOException   Parameters:   cl - the proxy class to annotate custom data for   Throws:   IOException
Java
//Java program demonstrating ObjectOutputStream  //illustrating annotateProxyClass(Class cl) method import java.io.*; class ObjectOutputStreamDemo extends ObjectOutputStream {  public ObjectOutputStreamDemo(OutputStream out) throws IOException  {  super(out);  }    public static void main(String[] args) throws IOException   ClassNotFoundException  {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStreamDemo oot = new ObjectOutputStreamDemo(fout);    Character c = 'A';    //illustrating annotateProxyClass(Class cl) method  oot.annotateProxyClass(Character.class);    //Write the specified object to the ObjectOutputStream  oot.writeObject(c);    //flushing  oot.flush();    //closing the stream  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);  System.out.print(oit.readObject());  oit.close();  } } 

פלט:  

A
    void close() :סוגר את הזרם. יש לקרוא לשיטה זו כדי לשחרר משאבים המשויכים לזרם. 
  Syntax :  public void close() throws IOException   Throws:   IOException
Java
//Java program demonstrating ObjectOutputStream  //illustrating close() method import java.io.*; class ObjectOutputStreamDemo {  public static void main(String[] args) throws IOException  {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStream oot = new ObjectOutputStream(fout);  oot.write(3);    //illustrating close()  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);  System.out.println(oit.read());  oit.close();  } } 
    פלט: 
3
    void defaultWriteObject() :כתוב את השדות הלא סטטיים והלא חולפים של המחלקה הנוכחית לזרם זה. ניתן לקרוא לזה רק משיטת writeObject של המחלקה המועברת בסידרה. זה יזרוק את NotActiveException אם הוא נקרא אחרת. 
  Syntax :  public void defaultWriteObject() throws IOException   Throws:   IOException 
Java
//Java program demonstrating ObjectOutputStream //illustrating defaultWriteObject() method import java.io.*; class ObjectOutputStreamDemo {  public static void main(String[] arg) throws IOException  ClassNotFoundException  {  Character a = 'A';  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStream oot = new ObjectOutputStream(fout);  oot.writeChar(a);  oot.flush();    // close the stream  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);    // reading the character  System.out.println(oit.readChar());  } }  class demo implements Serializable   {  String s = 'GeeksfoGeeks';  private void writeObject(ObjectOutputStream out)  throws IOException ClassNotFoundException  {  //demonstrating defaultWriteObject()  out.defaultWriteObject();  }  }  } 

פלט:  

A
    מוגן void drain():רוקן את כל הנתונים המאוחסנים ב-ObjectOutputStream. דומה לשטף אך אינו מפיץ את השטיפה לזרם הבסיסי. 
  Syntax :  protected void drain() throws IOException   Throws:   IOException
Java
//Java program demonstrating ObjectOutputStream methods //illustrating drain() method import java.io.*; class ObjectOutputStreamDemo extends ObjectOutputStream {  public ObjectOutputStreamDemo(OutputStream out) throws IOException  {  super(out);  }  public static void main(String[] arg) throws IOException  ClassNotFoundException  {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStream oot = new ObjectOutputStream(fout);  ObjectOutputStreamDemo obj = new ObjectOutputStreamDemo(oot);    //illustrating drain()  obj.drain();    //closing the underlying stream  oot.close();  fout.close();  } } 
    protected boolean enableReplaceObject(boolean enable):אפשר לזרם לבצע החלפה של אובייקטים בזרם. כאשר מופעלת שיטת replaceObject נקראת עבור כל אובייקט המועבר בסידרה. 
    אם ההפעלה נכונה ויש מנהל אבטחה מותקן השיטה הזו תחילה קוראת לשיטת checkPermission של מנהל האבטחה עם הרשאת SerializablePermission('enableSubstitution') כדי לוודא שזה בסדר לאפשר לזרם לבצע החלפה של אובייקטים בזרם. 
  Syntax :  protected boolean enableReplaceObject(boolean enable) throws SecurityException   Parameters:   enable - boolean parameter to enable replacement of objects   Returns:   the previous setting before this method was invoked   Throws:   SecurityException
Java
//Java program demonstrating ObjectOutputStream //illustrating enableReplaceObject method import java.io.*; class ObjectOutputStreamDemo extends ObjectOutputStream  {  public ObjectOutputStreamDemo(OutputStream out) throws IOException  {  super(out);  }  public static void main(String[] args) throws IOException   ClassNotFoundException  {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStreamDemo oot = new ObjectOutputStreamDemo(fout);  Character c = 'A';    //illustrating enableReplaceObject method  System.out.println(oot.enableReplaceObject(true));    //Write the specified object to the ObjectOutputStream  oot.writeObject(c);    //flushing  oot.flush();    //closing the stream  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);  System.out.print(oit.readObject());  oit.close();  } } 

פלט:  

false A
    ObjectOutputStream.PutField putFields():אחזר את האובייקט המשמש לאגירת שדות קבועים לכתיבה לזרם. השדות ייכתבו לזרם כשתקרא לשיטת writeFields. 
  Syntax :  public ObjectOutputStream.PutField putFields() throws IOException   Returns:   an instance of the class Putfield that holds the serializable fields   Throws:   IOException
Java
//Java program demonstrating ObjectOutputStream //illustrating PutField method import java.io.*; class ObjectOutputStreamDemo {  public static void main(String[] arg) throws IOException  ClassNotFoundException  {  Character a ='A';  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStream oot = new ObjectOutputStream(fout);  oot.writeChar(a);  oot.flush();    // close the stream  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);    // reading the character  System.out.println(oit.readChar());  } } class demo implements Serializable {  private void writeObject(ObjectOutputStream out)  throws IOException ClassNotFoundException  {  // Retrieve the object used to buffer  // persistent fields to be written to the stream  ObjectOutputStream.PutField fields = out.putFields();  } } 

פלט:  

A
    protected Object replaceObject(Object obj):שיטה זו תאפשר לתת-מחלקות מהימנות של ObjectOutputStream להחליף אובייקט אחד באחר במהלך הסידרה. החלפת אובייקטים מושבתת עד לקריאת enableReplaceObject. השיטה enableReplaceObject בודקת שניתן לסמוך על הזרם המבקש לבצע החלפה. ההתרחשות הראשונה של כל אובייקט שנכתב לזרם הסדרת מועברת ל- replaceObject. הפניות עוקבות לאובייקט מוחלפות באובייקט המוחזר על ידי הקריאה המקורית ל- replaceObject. כדי להבטיח שהמצב הפרטי של אובייקטים לא ייחשף בשוגג, רק זרמים מהימנים יכולים להשתמש ב- replaceObject. 
    שיטה זו נקראת פעם אחת בלבד כאשר כל אובייקט נתקל לראשונה. כל ההפניות הבאות לאובייקט יופנו לאובייקט החדש. שיטה זו צריכה להחזיר את האובייקט שיש להחליף או את האובייקט המקורי.
    ניתן להחזיר את Null כאובייקט שיש להחליף, אך עלול לגרום ל-NullReferenceException במחלקות המכילות הפניות לאובייקט המקורי מכיוון שהם עשויים לצפות לאובייקט במקום ל-null. 
  Syntax :  protected Object replaceObject(Object obj) throws IOException   Parameters:   obj - the object to be replaced   Returns:   the alternate object that replaced the specified one   Throws:   IOException
Java
//Java program demonstrating ObjectOutputStream //illustrating replaceObject method import java.io.*; class ObjectOutputStreamDemo extends ObjectOutputStream {  public ObjectOutputStreamDemo(OutputStream out) throws IOException  {  super(out);  }  public static void main(String[] args) throws IOException   ClassNotFoundException   {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStreamDemo oot = new ObjectOutputStreamDemo(fout);  String a = 'forGeeks';  String b = 'Geeks';  //Write the specified object to the ObjectOutputStream  oot.writeObject(a);    //flushing the stream  oot.flush();  oot.enableReplaceObject(true);    //illustrating replaceObject  System.out.print(oot.replaceObject(b));    //closing the stream  oot.close();    FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);  System.out.print(oit.readObject());  oit.close();  } } 

פלט:  

GeeksforGeeks
    void useProtocolVersion(int version) :ציין את גרסת פרוטוקול הזרם לשימוש בעת כתיבת הזרם. שגרה זו מספקת הוק כדי לאפשר לגרסה הנוכחית של Serialization לכתוב בפורמט התואם לאחור לגרסה קודמת של פורמט הזרם.
    ייעשה כל מאמץ כדי להימנע מהכנסת אי התאמה לאחור נוספת; אולם לפעמים אין אלטרנטיבה אחרת. 
  Syntax :  public void useProtocolVersion(int version) throws IOException   Parameters:   version - use ProtocolVersion from java.io.ObjectStreamConstants.   Throws:   IllegalStateException IllegalArgumentException IOException 
Java
 //Java program demonstrating ObjectOutputStream  //illustrating useProtocolVersion() method import java.io.*; class ObjectOutputStreamDemo extends ObjectOutputStream {  public ObjectOutputStreamDemo(OutputStream out) throws IOException  {  super(out);  }  public static void main(String[] args) throws IOException   ClassNotFoundException   {  FileOutputStream fout = new FileOutputStream('file.txt');  ObjectOutputStreamDemo oot = new ObjectOutputStreamDemo(fout);  String a = 'forGeeks';  String b = 'Geeks';  //illustrating useProtocolVersion()  oot.useProtocolVersion(ObjectStreamConstants.PROTOCOL_VERSION_2);  //Write the specified object to the ObjectOutputStream  oot.writeObject(b);  oot.writeObject(a);  //flushing the stream  oot.flush();  oot.close();  FileInputStream fin = new FileInputStream('file.txt');  ObjectInputStream oit = new ObjectInputStream(fin);  System.out.print(oit.readObject());  System.out.print(oit.readObject());  oit.close();  } } 

פלט:  

GeeksforGeeks

המאמר הבא: Java.io.ObjectOutputStream Class ב-Java | סט 2


 

צור חידון