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
字節(jié)流和字符流
字節(jié)流和字符流和用法幾乎完全一樣,區(qū)別在于字節(jié)流和字符流所操作的數(shù)據(jù)單元不同街佑。
字符流的由來: 因為數(shù)據(jù)編碼的不同谢翎,而有了對字符進(jìn)行高效操作的流對象。本質(zhì)其實就是基于字節(jié)流讀取時沐旨,去查了指定的碼表森逮。字節(jié)流和字符流的區(qū)別:
- 讀寫單位不同:字節(jié)流以字節(jié)(8bit)為單位,字符流以字符為單位磁携,根據(jù)碼表映射字符褒侧,一次可能讀多個字節(jié)。
- 處理對象不同:字節(jié)流能處理所有類型的數(shù)據(jù)(如圖片谊迄、avi等)闷供,而字符流只能處理字符類型的數(shù)據(jù)。
注:只要是處理純文本數(shù)據(jù)统诺,就優(yōu)先考慮使用字符流歪脏。 除此之外都使用字節(jié)流。
節(jié)點流(低級流)和處理流(高級流)
- 節(jié)點流:直接從數(shù)據(jù)源獲取信息的流
//節(jié)點流粮呢,直接傳入的參數(shù)是IO設(shè)備
FileInputStream fis = new FileInputStream("test.txt");
- 處理流:從別的流中獲取信息婿失,進(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)差異学少,也可以提供更方便的方法來完成輸入/輸出功能。
四大基類
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個基本步驟
- 設(shè)定輸入流的源。
- 創(chuàng)建指向源的輸入流乡洼。
- 讓輸入流讀取源中的數(shù)據(jù)。
- 關(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 )
- 設(shè)定輸出流的目的地挺庞。
- 創(chuàng)建指定目的地的輸出流。
- 讓輸出流把數(shù)據(jù)寫入到目的地稼病。
- 關(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()可能拋出的異常:
- ClassNotFoundException:沒有找到對應(yīng)的Class
- InvalidClassException:Class不匹配
- 反序列化由JVM直接構(gòu)造出Java對象膜赃,不調(diào)用構(gòu)造方法
- 可設(shè)置serialVersionUID作為版本號(非必需):
在對象里手動添加序列號: private static final long serialVersionUID=數(shù)字 ;
注意:
序列化與反序列化的對象需要實現(xiàn) Serializable 接口( Serializable 是標(biāo)記接口)
靜態(tài)對象無法被序列化。
被transient修飾的成員變量不能被序列化
ObjectOutputStream:對象的序列化流(方法:writeObject(p);寫入對象)
- 作用:
把對象以流的方式寫入到文件中保存揉忘,叫寫對象也叫序列化
- 構(gòu)造方法:
ObjectOutputStream(OutputStream out);//創(chuàng)建寫入指定 OutputStream 的 ObjectOutputStream跳座。
- 特有成員方法
void writeObject(Object obj);//將指定的對象寫入 ObjectOutputStream端铛。
- 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;
}