日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java文件序列化_Java序列化与反序列化,文件操作

發布時間:2025/3/8 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java文件序列化_Java序列化与反序列化,文件操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考兩篇博客:

http://blog.csdn.net/moreevan/article/details/6697777

http://blog.csdn.net/moreevan/article/details/6698529

針對第二篇博客,看了下面的評論,發現子類輸出的書號其實是父類的,書名是自己先添加的成員變量,我自己在實驗的時候,發現子類NewBook中使用父類Book的變量部分,輸出的都沒有值:基本類型的系統默認值是0,非基礎類型例如字符串系統默認是null

然后,當把父類Book實現了序列化接口時,這是才能全部輸出子類的變量值:

并且第二篇博客里也寫到了,如果在打印對象的時候,會調用對象的toString方法,即使我在子類中覆蓋了toString()方法并且沒有調用父類的toString方法,但是系統依然報出了第二篇博客中提到的那個錯誤:java.io.InvalidClassException: NewBook; no valid constructor

所以父類中加了個空的無參構造函數,這樣就可以正常打印出來了,下面是全碼:

1、父類沒有實現序列化接口:(此時不可以打印子類的變量值)

importjava.io.Serializable;public classBook {intbook_num;

String book_authour;//構造函數

public Book(intabook_num, String abook_author)

{this.book_num =abook_num;this.book_authour =abook_author;

}publicBook()

{

}//設置作者名

public voidsetBookAuthor(String abook_author)

{this.book_authour =abook_author;

}//設置書號

public void setBookNum(intabook_num)

{this.book_num =abook_num;

}//打印對象

publicString toString(){return "book_num:"+book_num+"\n"+"book_anthor:"+book_authour;

}

}

2、父類實現序列化接口:(此時可以打印子類的變量值)

importjava.io.Serializable;public class Book implementsSerializable {intbook_num;

String book_authour;/*** 實現序列化接口的時候一定要分配序列ID*/

private static final long serialVersionUID = 1L;//構造函數

public Book(intabook_num, String abook_author)

{this.book_num =abook_num;this.book_authour =abook_author;

}publicBook(){

}//設置作者名

public voidsetBookAuthor(String abook_author)

{this.book_authour =abook_author;

}//設置書號

public void setBookNum(intabook_num)

{this.book_num =abook_num;

}//打印對象

publicString toString(){return "book_num:"+book_num+"\n"+"book_anthor:"+book_authour;

}

}

3、子類:

importjava.io.Serializable;public class NewBook extends Book implementsSerializable{privateString book_version;/*** 實現序列化接口的時候一定要分配序列ID*/

private static final long serialVersionUID = 1L;public NewBook(intabook_num, String abook_author,String abook_version)

{super(abook_num, abook_author);this.book_version =abook_version;//TODO Auto-generated constructor stub

}

@Overridepublic voidsetBookAuthor(String abook_author)

{//TODO Auto-generated method stub

super.setBookAuthor(abook_author);

}

@Overridepublic void setBookNum(intabook_num)

{//TODO Auto-generated method stub

super.setBookNum(abook_num);

}public voidsetBookVersion(String abook_version)

{

book_version=abook_version;

}

@OverridepublicString toString()

{//TODO Auto-generated method stub

return "new_book_num:"+book_num+"new_book_anthor:"+book_authour+"new_book_version"+book_version;

}

}

4、主函數:

importjava.io.EOFException;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutput;importjava.io.ObjectOutputStream;public classBookSerializable {public static voidmain(String args[])

{/** Java里的main方法里不能直接調用非靜態的對象,要么調用靜態變量,要么調用在方法內部實例化的非靜態局部變量*/NewBook new_book1=new NewBook(1,"呼嘯山莊","1.0");

NewBook new_book2=new NewBook(2,"紅與黑","2.0");/** 將對象序列化到文件中*/

try{

File fil= new File("C://JavaFile//red_bean.txt");if(!fil.exists())

{

fil.createNewFile();

}

FileOutputStream fil_input= newFileOutputStream(fil);

ObjectOutputStream obj_output= newObjectOutputStream(fil_input);

obj_output.writeObject(new_book1);

obj_output.reset();

new_book1.setBookVersion("3.0");

obj_output.writeObject(new_book1);

obj_output.reset();

new_book1.setBookVersion("4.0");

obj_output.writeObject(new_book1);

obj_output.writeObject(new_book2);

obj_output.writeObject(null);//寫入結束標志方便讀取(非常重要,如果不寫入,在讀取的時候無法定位讀取結束);

obj_output.close();//關閉對象輸出流

fil_input.close();//關閉文件輸出流

} catch(FileNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}/** 將對象從文件中讀出來*/ObjectInputStream obj_input;try{

FileInputStream fil_input= new FileInputStream("C://JavaFile//red_bean.txt");

obj_input= newObjectInputStream(fil_input);

Object boj;while((boj = obj_input.readObject())!=null)//循環讀取對象流

{

NewBook new_bookReadTemp=(NewBook)boj;

System.out.println(new_bookReadTemp);/** 讀出的時候按照寫入的順序讀取*/

/*NewBook new_bookRead1 = (NewBook)obj_input.readObject();

NewBook new_bookRead2 = (NewBook)obj_input.readObject();

NewBook new_bookRead3 = (NewBook)obj_input.readObject();

NewBook new_bookRead4 = (NewBook)obj_input.readObject();

//NewBook new_bookRead5 = (NewBook)obj_input.readObject();

System.out.println(new_bookRead1);

System.out.println(new_bookRead2);

System.out.println(new_bookRead3);

System.out.println(new_bookRead4);

//System.out.println(new_bookRead5);*/}

obj_input.close();

fil_input.close();

}catch(EOFException e){

e.printStackTrace();

}catch(FileNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(ClassNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

自己動手敲了一遍代碼的感受:

確實應該多多動手呀!編慣了Android,感覺養成了很不好的語法習慣,main()是個靜態方法,我還在main方法外面定義了了非靜態對象,在main方法里用,顯然不行啊,調用非靜態方法,然后在非靜態方法里使用非靜態變量,或者直接在main方法里定義非靜態局部變量并使用,Java里沒有全局變量的概念,要共享數據就專門定義一個share類, 里面全是靜態的變量方法。不要把安卓的onCreat和main混在一起。main里的變量定義和使用:http://blog.csdn.net/zi_jun/article/details/7553132

其他的Java序列化較好博客:

http://blog.csdn.net/wangzhiqing3/article/details/8392803

Java文件操作:

http://www.cnblogs.com/springcsc/archive/2009/12/03/1616367.html

http://blog.csdn.net/smartcat86/article/details/4085739/

總結

以上是生活随笔為你收集整理的java文件序列化_Java序列化与反序列化,文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。