在本教程中,我們將借助示例學(xué)習(xí)Java ObjectOutputStream及其方法。
java.io包的ObjectInputStream類可用于讀取ObjectOutputStream先前編寫的對象。
它進行了InputStream抽象類。
在學(xué)習(xí)ObjectInputStream類之前,請確保您了解ObjectOutputStream類。
ObjectInputStream主要用于讀取ObjectOutputStream寫入的數(shù)據(jù)。
基本上,ObjectOutputStream將Java對象轉(zhuǎn)換為相應(yīng)的流。 這稱為序列化。 這些轉(zhuǎn)換后的流可以存儲在文件中,也可以通過網(wǎng)絡(luò)傳輸。
現(xiàn)在,如果需要讀取這些對象,則將使用ObjectInputStream,它將把流轉(zhuǎn)換回相應(yīng)的對象。這稱為反序列化。
為了創(chuàng)建對象輸入流,我們必須首先導(dǎo)入java.io.ObjectInputStream包。導(dǎo)入包后,就可以創(chuàng)建輸入流。
//創(chuàng)建與指定文件鏈接的文件輸入流 FileInputStream fileStream = new FileInputStream(String file); //使用文件輸入流創(chuàng)建對象輸入流 ObjectInputStream objStream = new ObjectInputStream(fileStream);
在上面的示例中,我們創(chuàng)建了一個名為objStream的對象輸入流,該對象輸入流與名為fileStream的文件輸入流鏈接。
現(xiàn)在,objStream可以使用讀取文件中的對象。
ObjectInputStream類提供InputStream類中存在的不同方法的實現(xiàn)。
read() - 從輸入流中讀取一個字節(jié)的數(shù)據(jù)
readBoolean() - 以布爾形式讀取數(shù)據(jù)
readChar() - 以字符形式讀取數(shù)據(jù)
readInt() - 以整數(shù)形式讀取數(shù)據(jù)
readObject() - 從輸入流中讀取對象
讓我們看看如何使用ObjectInputStream類讀取由ObjectOutputStream類創(chuàng)建的對象。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; class Main { public static void main(String[] args) { int data1 = 5; String data2 = "This is nhooo"; try { FileOutputStream file = new FileOutputStream("file.txt"); ObjectOutputStream output = new ObjectOutputStream(file); //使用ObjectOutputStream寫入文件 output.writeInt(data1); output.writeObject(data2); FileInputStream fileStream = new FileInputStream("file.txt"); //創(chuàng)建對象輸入流 ObjectInputStream objStream = new ObjectInputStream(fileStream); //使用readIng()方法 System.out.println("整數(shù)數(shù)據(jù) :" + objStream.readInt()); //使用readObject()方法 System.out.println("字符串數(shù)據(jù): " + objStream.readObject()); output.close(); objStream.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
整數(shù)數(shù)據(jù): 5 字符串數(shù)據(jù): This is nhooo
在上面的示例中,我們使用了readInt()和readObject()方法從文件中讀取整數(shù)數(shù)據(jù)和對象數(shù)據(jù)。
在這里,我們使用了ObjectOutputStream將數(shù)據(jù)寫入文件。 然后,我們使用ObjectInputStream從文件中讀取數(shù)據(jù)。
讓我們看另一個實際的實例,
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class Dog implements Serializable { String name; String breed; public Dog(String name, String breed) { this.name = name; this.breed = breed; } } class Main { public static void main(String[] args) { //創(chuàng)建一個Dog類的對象 Dog dog = new Dog("Tyson", "Labrador"); try { FileOutputStream file = new FileOutputStream("file.txt"); //創(chuàng)建一個ObjectOutputStream ObjectOutputStream output = new ObjectOutputStream(file); //將對象寫入輸出流 output.writeObject(dog); FileInputStream fileStream = new FileInputStream("file.txt"); //創(chuàng)建一個ObjectInputStream ObjectInputStream input = new ObjectInputStream(fileStream); //讀取對象 Dog newDog = (Dog) input.readObject(); System.out.println("狗的名字: " + newDog.name); System.out.println("犬種: " + newDog.breed); output.close(); input.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
狗的名字: Tyson 犬種: Labrador
在上面的示例中,我們創(chuàng)建了
ObjectOutputStream使用名為file的FileOutputStream命名輸出
ObjectInputStream使用名為fileStream的FileInputStream命名輸入
Dog類的對象dog
在這里,我們?nèi)缓笫褂脤ο筝敵隽鲗ο髮懭胛募2⑶?,對象輸入流從文件中讀取對象。
注意:Dog類實現(xiàn)Serializable接口。這是因為ObjectOutputStream只將可序列化的對象寫入輸出流。
方法 | 內(nèi)容描述 |
---|---|
available() | 返回輸入流中的可用字節(jié)數(shù) |
mark() | 標記輸入流中已讀取數(shù)據(jù)的位置 |
reset() | 將控件返回到輸入流中設(shè)置了標記的點 |
skipBytes() | 從輸入流中跳過并丟棄指定的字節(jié) |
close() | 關(guān)閉對象輸入流 |