狂懟面試官——JAVA IO知識點梳理

Java對數(shù)據(jù)的操作是通過流的方式贡歧,io是java中實現(xiàn)輸入輸出的基礎(chǔ)幔睬,它可以很方便的完成數(shù)據(jù)的輸入輸出操作,Java把不同的輸入輸出抽象為流秒际,通過流的方式允許Java程序使用相同的方式來訪問不同的輸入赫模、輸出树肃。

補(bǔ)充( File )

構(gòu)造函數(shù)

//構(gòu)造函數(shù)File(String pathname)
File f1 =new File("c:\\abc\\1.txt");
//File(String parent,String child)
File f2 =new File("c:\\abc","2.txt");
//File(File parent,String child)
File f3 =new File("c:"+File.separator+"abc");//separator 跨平臺分隔符
File f4 =new File(f3,"3.txt");
System.out.println(f1);//c:\abc\1.txt

創(chuàng)建與刪除方法

//如果文件存在返回false,否則返回true并且創(chuàng)建文件 
boolean createNewFile();
//創(chuàng)建一個File對象所對應(yīng)的目錄瀑罗,成功返回true胸嘴,否則false。且File對象必須為路徑而不是文件斩祭。只會創(chuàng)建最后一級目錄筛谚,如果上級目錄不存在就拋異常。
boolean mkdir();
//創(chuàng)建一個File對象所對應(yīng)的目錄停忿,成功返回true,否則false蚊伞。且File對象必須為路徑而不是文件席赂。創(chuàng)建多級目錄,創(chuàng)建路徑中所有不存在的目錄
boolean mkdirs()    ;
//如果文件存在返回true并且刪除文件时迫,否則返回false
boolean delete();
//在虛擬機(jī)終止時颅停,刪除File對象所表示的文件或目錄。
void deleteOnExit();

判斷方法

boolean canExecute()    ;//判斷文件是否可執(zhí)行
boolean canRead();//判斷文件是否可讀
boolean canWrite();//判斷文件是否可寫
boolean exists();//判斷文件是否存在
boolean isDirectory();//判斷是否是目錄
boolean isFile();//判斷是否是文件
boolean isHidden();//判斷是否是隱藏文件或隱藏目錄
boolean isAbsolute();//判斷是否是絕對路徑 文件不存在也能判斷

獲取方法

String getName();//返回文件或者是目錄的名稱
String getPath();//返回路徑
String getAbsolutePath();//返回絕對路徑
String getParent();//返回父目錄掠拳,如果沒有父目錄則返回null
long lastModified();//返回最后一次修改的時間
long length();//返回文件的長度
File[] listRoots();// 列出所有的根目錄(Window中就是所有系統(tǒng)的盤符)
String[] list() ;//返回一個字符串?dāng)?shù)組癞揉,給定路徑下的文件或目錄名稱字符串
String[] list(FilenameFilter filter);//返回滿足過濾器要求的一個字符串?dāng)?shù)組
File[]  listFiles();//返回一個文件對象數(shù)組,給定路徑下文件或目錄
File[] listFiles(FilenameFilter filter);//返回滿足過濾器要求的一個文件對象數(shù)組

以上方法中包含了一個重要的接口 FileNameFilter ,該接口是個文件過濾器喊熟,包含了一個 accept(File dir,String name) 方法柏肪,該方法依次對指定File的所有子目錄或者文件進(jìn)行迭代,按照指定條件芥牌,進(jìn)行過濾烦味,過濾出滿足條件的所有文件。

// 文件過濾
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File file, String filename) {
                return filename.endsWith(".mp3");
            }
        });

關(guān)于IO

流有輸入和輸出壁拉,輸入時是流從數(shù)據(jù)源流向程序谬俄。輸出時是流從程序傳向數(shù)據(jù)源,而數(shù)據(jù)源可以是內(nèi)存弃理,文件溃论,網(wǎng)絡(luò)或程序等。

輸入流:只能從中讀取數(shù)據(jù)痘昌,而不能向其寫入數(shù)據(jù)钥勋。(輸入程序)

輸出流:只能向其寫入數(shù)據(jù),而不能從中讀取數(shù)據(jù)控汉。(程序輸出)

同步io與異步io

同步io:

讀寫io時代碼等待數(shù)據(jù)返回后才繼續(xù)執(zhí)行后續(xù)代碼 代碼編寫簡單笔诵,cpu執(zhí)行效率低

異步io:

讀寫io時僅發(fā)出請求,然后立刻執(zhí)行后續(xù)代碼 代碼編寫復(fù)雜姑子,cpu執(zhí)行效率高

JDK提供的java.io是同步io乎婿,java.nio是異步io

狂懟面試官——JAVA IO知識點梳理

字節(jié)流和字符流

字節(jié)流和字符流和用法幾乎完全一樣,區(qū)別在于字節(jié)流和字符流所操作的數(shù)據(jù)單元不同街佑。

字符流的由來: 因為數(shù)據(jù)編碼的不同谢翎,而有了對字符進(jìn)行高效操作的流對象。本質(zhì)其實就是基于字節(jié)流讀取時沐旨,去查了指定的碼表森逮。字節(jié)流和字符流的區(qū)別:

  1. 讀寫單位不同:字節(jié)流以字節(jié)(8bit)為單位,字符流以字符為單位磁携,根據(jù)碼表映射字符褒侧,一次可能讀多個字節(jié)。
  2. 處理對象不同:字節(jié)流能處理所有類型的數(shù)據(jù)(如圖片谊迄、avi等)闷供,而字符流只能處理字符類型的數(shù)據(jù)。

注:只要是處理純文本數(shù)據(jù)统诺,就優(yōu)先考慮使用字符流歪脏。 除此之外都使用字節(jié)流。

節(jié)點流(低級流)和處理流(高級流)

  1. 節(jié)點流:直接從數(shù)據(jù)源獲取信息的流
//節(jié)點流粮呢,直接傳入的參數(shù)是IO設(shè)備
FileInputStream fis = new FileInputStream("test.txt");
  1. 處理流:從別的流中獲取信息婿失,進(jìn)行封裝或連接的流
//處理流钞艇,直接傳入的參數(shù)是流對象
BufferedInputStream bis = new BufferedInputStream(fis);

處理流的好處

當(dāng)使用處理流進(jìn)行輸入/輸出時,程序并不會直接連接到實際的數(shù)據(jù)源豪硅,沒有和實際的輸入/輸出節(jié)點連接哩照。使用處理流的一個明顯好處是,只要使用相同的處理流舟误,程序就可以采用完全相同的輸入/輸出代碼來訪問不同的數(shù)據(jù)源葡秒,隨著處理流所包裝節(jié)點流的變化,程序?qū)嶋H所訪問的數(shù)據(jù)源也相應(yīng)地發(fā)生變化嵌溢。

實際上眯牧,Java使用處理流來包裝節(jié)點流是一種典型的 裝飾器設(shè)計模式 ,通過使用處理流來包裝不同的節(jié)點流赖草,既可以消除不同節(jié)點流的實現(xiàn)差異学少,也可以提供更方便的方法來完成輸入/輸出功能。

四大基類

狂懟面試官——JAVA IO知識點梳理

InputStream , Reader , OutputStream , Writer 秧骑,這四大抽象基類版确,本身并不能創(chuàng)建實例來執(zhí)行輸入/輸出,但它們將成為所有輸入/輸出流的模版乎折,所以它們的方法是所有輸入/輸出流都可以使用的方法绒疗。類似于集合中的Collection接口。

注意:在執(zhí)行完流操作后骂澄,要調(diào)用 close() 方法來關(guān)系輸入流吓蘑, 因為程序里打開的IO資源不屬于內(nèi)存資源,垃圾回收機(jī)制無法回收該資源坟冲,所以應(yīng)該顯式關(guān)閉文件IO資源磨镶。

1. InputStream

InputStream 是所有的輸入字節(jié)流的父類,它是一個抽象類健提,主要包含三個方法:

//讀取一個字節(jié)并以整數(shù)的形式返回(0~255),如果返回-1已到輸入流的末尾琳猫。 
int read() ; 
//讀取一系列字節(jié)并存儲到一個數(shù)組buffer私痹,返回實際讀取的字節(jié)數(shù)脐嫂,如果讀取前已到輸入流的末尾返回-1。 
int read(byte[] buffer) 紊遵; 
//讀取length個字節(jié)并存儲到一個字節(jié)數(shù)組buffer雹锣,從off位置開始存,最多l(xiāng)en, 返回實際讀取的字節(jié)數(shù)癞蚕,如果讀取前以到輸入流的末尾返回-1。 
int read(byte[] buffer, int off, int len) 辉哥; 

2. Reader

Reader 是所有的輸入字符流的父類桦山,它是一個抽象類攒射,主要包含三個方法:

//讀取一個字符并以整數(shù)的形式返回(0~255),如果返回-1已到輸入流的末尾。 
int read() 恒水; 
//讀取一系列字符并存儲到一個數(shù)組buffer会放,返回實際讀取的字符數(shù),如果讀取前已到輸入流的末尾返回-1钉凌。 
int read(char[] cbuf) 咧最; 
//讀取length個字符,并存儲到一個數(shù)組buffer,從off位置開始存,最多讀取len御雕,返回實際讀取的字符數(shù)矢沿,如果讀取前以到輸入流的末尾返回-1。 
int read(char[] cbuf, int off, int len) 

InputStream和Reader還支持如下方法來移動流中的指針位置:

//在此輸入流中標(biāo)記當(dāng)前的位置
//readlimit - 在標(biāo)記位置失效前可以讀取字節(jié)的最大限制酸纲。
void mark(int readlimit)
// 測試此輸入流是否支持 mark 方法
boolean markSupported()
// 跳過和丟棄此輸入流中數(shù)據(jù)的 n 個字節(jié)/字符
long skip(long n)
//將此流重新定位到最后一次對此輸入流調(diào)用 mark 方法時的位置
void reset()

3. OutputStream

OutputStream 是所有的輸出字節(jié)流的父類捣鲸,它是一個抽象類,主要包含如下四個方法:

//向輸出流中寫入一個字節(jié)數(shù)據(jù),該字節(jié)數(shù)據(jù)為參數(shù)b的低8位闽坡。 
void write(int b) ; 
//將一個字節(jié)類型的數(shù)組中的數(shù)據(jù)寫入輸出流栽惶。 
void write(byte[] b); 
//將一個字節(jié)類型的數(shù)組中的從指定位置(off)開始的,len個字節(jié)寫入到輸出流。 
void write(byte[] b, int off, int len); 
//將輸出流中緩沖的數(shù)據(jù)全部寫出到目的地疾嗅。 
void flush();

4. Writer

Writer 是所有的輸出字符流的父類外厂,它是一個抽象類,主要包含如下六個方法:

//向輸出流中寫入一個字符數(shù)據(jù),該字節(jié)數(shù)據(jù)為參數(shù)b的低16位。 
void write(int c); 
//將一個字符類型的數(shù)組中的數(shù)據(jù)寫入輸出流代承, 
void write(char[] cbuf) 
//將一個字符類型的數(shù)組中的從指定位置(offset)開始的,length個字符寫入到輸出流汁蝶。 
void write(char[] cbuf, int offset, int length); 
//將一個字符串中的字符寫入到輸出流。 
void write(String string); 
//將一個字符串從offset開始的length個字符寫入到輸出流次泽。 
void write(String string, int offset, int length); 
//將輸出流中緩沖的數(shù)據(jù)全部寫出到目的地穿仪。 
void flush() 

可以看出,Writer比OutputStream多出兩個方法意荤,主要是支持寫入字符和字符串類型的數(shù)據(jù)啊片。

使用Java的IO流執(zhí)行輸出時,不要忘記關(guān)閉輸出流玖像,關(guān)閉輸出流除了可以保證流的物理資源被回收之外紫谷,還能將輸出流緩沖區(qū)的數(shù)據(jù)flush到物理節(jié)點里(因為在執(zhí)行close()方法之前,自動執(zhí)行輸出流的flush()方法)

四大基類細(xì)分流

文件字符輸入流(FileReader)

作用:把硬盤文件中的數(shù)據(jù)以字符的方式讀取到內(nèi)存中

構(gòu)造方法:

FileReader(File file);//在給定從中讀取數(shù)據(jù)的 File 的情況下創(chuàng)建一個新 FileReader捐寥。
FileReader(FileDescriptor fd);//在給定從中讀取數(shù)據(jù)的 FileDescriptor 的情況下創(chuàng)建一個新 FileReader笤昨。
FileReader(String fileName);//在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個新 FileReader。 

文件字符輸出流(FileWriter)

作用:把內(nèi)存中的數(shù)據(jù)寫入到文件中

構(gòu)造方法:

FileWriter(String fileName);//根據(jù)給定的文件名構(gòu)造一個 FileWriter 對象握恳。
FileWriter(File file);//根據(jù)給定的 File 對象構(gòu)造一個 FileWriter 對象瞒窒。

文件字節(jié)輸入流 ( FileInputStream )

使用輸入流的4個基本步驟

  1. 設(shè)定輸入流的源。
  2. 創(chuàng)建指向源的輸入流乡洼。
  3. 讓輸入流讀取源中的數(shù)據(jù)。
  4. 關(guān)閉輸入流。

構(gòu)造方法:

// 通過打開一個到實際文件的連接來創(chuàng)建一個FileInputStream芳来,該文件通過文件系統(tǒng)中的File對象file指定
 FileInputStream(File file);
 // 通過打開一個到實際文件的連接來創(chuàng)建一個FileInputStream困肩,該文件通過文件系統(tǒng)中的路徑name指定
 FileInputStream(String name);

使用輸入流讀取文件

int read(byte b[])// 從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲在緩沖區(qū)數(shù)組 b中,返回實際讀取的字節(jié)數(shù)目。到達(dá)尾部返回-1.
int read(byte[] b, int off, int len)//將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組。返回實際讀取的字節(jié)數(shù)目术奖。到達(dá)尾部返回-1。off指定從某個位置開始存取轻绞。
long skip()//從源中讀取單個字節(jié)的數(shù)據(jù)采记,該方法返回字節(jié)值(0-255),未讀取出字節(jié)返回-1铲球。
void close()//關(guān)閉流

使用實例

public static void main(String[] args) throws IOException {
        String path = FileInputStreamDemo.class.getResource("/").getPath() + "test.txt";
        System.out.println("獲取文件路徑:" + path);
        File file = new File(path);
        //以File為構(gòu)造函數(shù)對象
        FileInputStream fileInputStream = new FileInputStream(file);
        //以字符串path為構(gòu)造函數(shù)對象
        FileInputStream fileInputStream2 = new FileInputStream(path);
        String s = new String();
        byte[] b = new byte[1024];
        int length=0;
        if((length = fileInputStream.read(b))!=-1) {
            s+=new String(b,"GBK");
            System.out.println(s);
        }
        fileInputStream.close();
        fileInputStream2.close();

文件字節(jié)輸出流( FileOutputStream )

  1. 設(shè)定輸出流的目的地挺庞。
  2. 創(chuàng)建指定目的地的輸出流。
  3. 讓輸出流把數(shù)據(jù)寫入到目的地稼病。
  4. 關(guān)閉輸出流选侨。

構(gòu)造方法

如果對文件讀取需求比較簡單,可以使用==文件字節(jié)輸出流FileOutputStream類然走。==字節(jié)文件輸出流是用于將數(shù)據(jù)寫入到File援制,從程序中寫入到其他位置。

FileOutputStream(File file)// 創(chuàng)建一個向指定File對象表示的文件中寫入數(shù)據(jù)的文件輸出流
FileOutputStream(File file, boolean append)// 創(chuàng)建一個向指定File對象表示的文件中寫入數(shù)據(jù)的文件輸出流,append為true則是在文件后面追加寫入
FileOutputStream(String name)// 創(chuàng)建一個向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流
FileOutputStream(String name, boolean append)//創(chuàng)建一個向具有指定name的文件中寫入數(shù)據(jù)的輸出文件流,append為true則是在文件后面追加寫入

使用輸出流寫字節(jié)

字節(jié)輸出流的write方法以字節(jié)為單位向目的地寫入單個數(shù)據(jù)芍瑞。

void write(int n)輸出流調(diào)用該方法向目的地寫入單個字節(jié)晨仑。
void write(byte b[])輸出流調(diào)用該方法向目的地寫入一個字節(jié)數(shù)組。
void write(byte b[],int off,int len)給定字節(jié)數(shù)組中起始于偏移量off處取len個字節(jié)寫到目的地拆檬。
void close()關(guān)閉輸出流

使用實例

public static void main(String[] args) throws IOException {
        String path = FileInputStreamDemo.class.getResource("/").getPath() + "test.txt";
        System.out.println("獲取文件路徑:" + path);
        File file = new File(path);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        FileOutputStream fileOutputStream2 = new FileOutputStream(path);
        String s = " good!";
        byte[] b;
        b=s.getBytes();
        fileOutputStream.write(b);
        fileOutputStream.close();
        fileOutputStream2.close();
    }

緩沖流

緩沖流概述

緩沖流是對文件流處理的一種流洪己,增強(qiáng)了讀寫文件的能力。夠更高效的讀寫信息竟贯。因為緩沖流先將數(shù)據(jù)緩存起來答捕,然后一起寫入或讀取出來。

flush() 和 close() flush 是從緩沖區(qū)把文件寫出屑那, close 是將文件從緩沖區(qū)內(nèi)寫出并且關(guān)閉相應(yīng)的流拱镐。

字節(jié)緩沖流:BufferedInputStream,BufferedOutputStream

字符緩沖流:BufferedReader持际,BufferedWriter

1. BufferedOutputStream

繼承父類(OutputStream)共性成員方法

構(gòu)造方法:

BufferedOutputStream(OutputStream out);//創(chuàng)建一個新的緩沖輸出流沃琅,以將數(shù)據(jù)寫入指定的底層輸出流。
BufferedOutputStream(OutputStream out, int size);//創(chuàng)建一個新的緩沖輸出流蜘欲,以將具有指定緩沖區(qū)大小的數(shù)據(jù)寫入指定的底層輸出流益眉。

注意:相比于字節(jié)輸出流,使用緩沖字節(jié)輸出流的時候需要flush將字節(jié)壓入文件

2.BufferedInputStream

繼承父類(InputStream)共性成員方法

構(gòu)造方法:

BufferedInputStream(InputStream in);//創(chuàng)建一個 BufferedInputStream 并保存其參數(shù)姥份,即輸入流 in呜叫,以便將來使用空繁。
BufferedInputStream(InputStream in, int size);//創(chuàng)建具有指定緩沖區(qū)大小的 BufferedInputStream 并保存其參數(shù),即輸入流 in朱庆,以便將來使用。

3.BufferedWriter

繼承父類(Writer)共性成員方法

構(gòu)造方法:

BufferedWriter(Writer out);//創(chuàng)建一個使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流闷祥。
BufferedWriter(Writer out, int sz);//創(chuàng)建一個使用給定大小輸出緩沖區(qū)的新緩沖字符輸出流娱颊。 

特有成員方法: void newLine();//寫入一個行分隔符。

4.BufferedReader

繼承父類(Reader)共性成員方法

構(gòu)造方法:

BufferedReader(Reader in);//創(chuàng)建一個使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流凯砍。
BufferedReader(Reader in, int sz);//創(chuàng)建一個使用指定大小輸入緩沖區(qū)的緩沖字符輸入流箱硕。

特有成員方法: String readLine();//讀取一個文本行。(到達(dá)末尾返回null)

隨機(jī)流

概述

RandomAccessFile類創(chuàng)建的流稱作隨機(jī)流悟衩,RandomAccessFile類既不是InputStream類的子類剧罩,也不是OutputStream類的子類。

當(dāng)準(zhǔn)備對一個文件進(jìn)行讀寫操作時座泳,創(chuàng)建一個指向該文件的隨機(jī)流即可惠昔,這樣既可以從這個流中讀取文件的數(shù)據(jù),也可以通過這個流寫入數(shù)據(jù)到文件挑势。

構(gòu)造方法

RandomAccessFile(String name, String mode): 參數(shù)name用來確定一個文件名镇防,給出創(chuàng)建的流的源,也是流的目的地潮饱。參數(shù)mode取r(只讀)或rw(可讀寫)来氧,決定創(chuàng)建的流對文件的訪問權(quán)力。

數(shù)組流

流的源和目的地除了可以是文件香拉,還可以是計算機(jī)內(nèi)存啦扬。不需要手動關(guān)閉流。只有字節(jié)流凫碌,沒有字符流

字節(jié)數(shù)組輸入流(ByteArrayInputStream)

byte[] src = "IO is easy".getBytes();
InputStream is = new ByteArrayInputStream(src);
byte[] flush = new byte[1024];
int len =-1;
while(len=is.read(flush)!=-1){
 String str = new String(flush,o,len);
 System.out.println(str);
}

字節(jié)數(shù)組輸出流(ByteArrayOutputStream)

byte[] dest = null;//其實可以不用扑毡,為了風(fēng)格統(tǒng)一
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String str = "IO is easy";
byte[] datas=str.getBytes();//字符串--->字節(jié)數(shù)組(編碼)
baos.write(datas,0,datas.length);
baos.flush();
dest = baos.toByteArray();//獲取數(shù)據(jù)
System.out.println(dest.length + new String(dest,0,dest.length));

數(shù)據(jù)流

概述

數(shù)據(jù)輸入流DataInputStream允許應(yīng)用程序以與機(jī)器無關(guān)方式從底層輸入流中讀取基本Java數(shù)據(jù)類型。應(yīng)用程序可以使用數(shù)據(jù)輸出流寫入稍后由數(shù)據(jù)輸入流讀取的數(shù)據(jù)证鸥。

例子

import java.io.*;
public class text1 {
public static void main(String[] args) throws IOException {
 DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("aa.txt")));
 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("aa.txt")));
 dos.writeUTF("行大旺");
 dos.writeInt(18);
 dos.writeBoolean(false);
 dos.writeChar('a');
 dos.flush();
 String msg = dis.readUTF();
 int age = dis.readInt();
 boolean flag = dis.readBoolean();
 char ch = dis.readChar();
 System.out.println(msg);
 System.out.println(age);
 System.out.println(flag);
 System.out.println(ch);
 dos.close();
 dis.close();
}
}

對象流(序列化與反序列化)

對象流可以將一個對象寫出僚楞,或者讀取一個對象到程序中,也就是執(zhí)行了序列化和反序列化的操作

序列化將把一個Java對象變成二進(jìn)制內(nèi)容(byte[])存放到某種類型的永久存儲器上稱為保持枉层。如果一個對象可以被存放到磁盤或磁帶上泉褐,或者可以發(fā)送到另外一臺機(jī)器并存放到存儲器或磁盤上,那么這個對象就被稱為可保持的鸟蜡。

反序列化是指把一個二進(jìn)制內(nèi)容(byte[])變成Java對象

使用ObjectOutputStream和ObjectInputStream實現(xiàn)序列化和反序列化 readObject()可能拋出的異常:

  1. ClassNotFoundException:沒有找到對應(yīng)的Class
  2. InvalidClassException:Class不匹配
  3. 反序列化由JVM直接構(gòu)造出Java對象膜赃,不調(diào)用構(gòu)造方法
  4. 可設(shè)置serialVersionUID作為版本號(非必需):

在對象里手動添加序列號: private static final long serialVersionUID=數(shù)字 ;

注意:

  1. 序列化與反序列化的對象需要實現(xiàn) Serializable 接口( Serializable 是標(biāo)記接口)

  2. 靜態(tài)對象無法被序列化。

  3. 被transient修飾的成員變量不能被序列化

  4. ObjectOutputStream:對象的序列化流(方法:writeObject(p);寫入對象)

  • 作用:

把對象以流的方式寫入到文件中保存揉忘,叫寫對象也叫序列化

  • 構(gòu)造方法:
ObjectOutputStream(OutputStream out);//創(chuàng)建寫入指定 OutputStream 的 ObjectOutputStream跳座。
  • 特有成員方法
void writeObject(Object obj);//將指定的對象寫入 ObjectOutputStream端铛。 
  1. ObejctInputStream:對象的返序列化流(方法:readObject():讀對象)
  • 作用:

把文件中保存的對象,以流的方式讀取出來疲眷,叫做讀對象禾蚕,也叫對象的返序列化

  • 構(gòu)造方法:
ObjectInputStream(InputStream in);//創(chuàng)建從指定 InputStream 讀取的 ObjectInputStream。
  • 特有成員方法
Object readObject();//從 ObjectInputStream 讀取對象狂丝。 

序列化實例

// 將Account對象保存到文件中
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(account);
oos.flush();

// 讀取Account的內(nèi)容
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Account account2 = (Account)ois.readObject();

由于在保存Account對象后修改了Account的結(jié)構(gòu)换淆,會導(dǎo)致serialVersionUID的值發(fā)生變化,在讀文件(反序列化)的時候就會出錯几颜。所以為了更好的兼容性倍试,在序列化的時候,最好將serialVersionUID的值設(shè)置為固定的蛋哭。

public class Account implements Serializable {

    private static final long serialVersionUID = 1L;

    private int age;
    private long birthday;
    private String name;
}

來源:https://www.tuicool.com/articles/vmUJNnv

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末县习,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谆趾,更是在濱河造成了極大的恐慌躁愿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺妓,死亡現(xiàn)場離奇詭異攘已,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怜跑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門样勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人性芬,你說我怎么就攤上這事峡眶。” “怎么了植锉?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵辫樱,是天一觀的道長。 經(jīng)常有香客問我俊庇,道長狮暑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任辉饱,我火速辦了婚禮搬男,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彭沼。我一直安慰自己缔逛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褐奴,像睡著了一般按脚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敦冬,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天辅搬,我揣著相機(jī)與錄音,去河邊找鬼脖旱。 笑死伞辛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夯缺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甘耿,長吁一口氣:“原來是場噩夢啊……” “哼踊兜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佳恬,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捏境,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毁葱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垫言,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年倾剿,在試婚紗的時候發(fā)現(xiàn)自己被綠了筷频。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡前痘,死狀恐怖凛捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芹缔,我是刑警寧澤坯癣,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站最欠,受9級特大地震影響示罗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芝硬,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一蚜点、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吵取,春花似錦禽额、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽实辑。三九已至,卻和暖如春藻丢,著一層夾襖步出監(jiān)牢的瞬間剪撬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工悠反, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留残黑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓斋否,卻偏偏與公主長得像梨水,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茵臭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 想了解一下學(xué)Java的小伙伴們,在學(xué)習(xí)Java的時候有沒有去總結(jié)知識點缨硝,哪些知識點我們沒有掌握摩钙,哪些知識點是我們還...
    墨雨軒夏閱讀 255評論 0 1
  • github(持續(xù)更新,歡迎star,fork補(bǔ)充) 自動裝箱(autoboxing)與拆箱(unboxing) ...
    Devnan閱讀 2,681評論 4 37
  • 久違的晴天查辩,家長會胖笛。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了宜肉。班主任說已經(jīng)安排了三個家長分享經(jīng)驗匀钧。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友谬返。感恩相遇之斯!感恩不離不棄。 中午開了第一次的黨會遣铝,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,566評論 0 11
  • 可愛進(jìn)取佑刷,孤獨成精。努力飛翔酿炸,天堂翱翔瘫絮。戰(zhàn)爭美好,孤獨進(jìn)取填硕。膽大飛翔麦萤,成就輝煌鹿鳖。努力進(jìn)取,遙望壮莹,和諧家園翅帜。可愛游走...
    趙原野閱讀 2,727評論 1 1