Posted on 2009-05-30 23:34
啥都寫點 閱讀(322)
評論(0) 編輯 收藏 所屬分類:
J2SE
關鍵技術:
- 之所以讀取jar包中的資源文件與讀取普通文件不同,是因為文件的路徑問題,jar包中的資源文件的路徑比普通文件的路徑復雜得多。
- Class類的getResource方法獲得資源文件的URL,通過URL的openStream方法能打開資源文件的輸入流。
- Class類的getResourceAsStream方法直接打開資源文件的輸入流。
- 調用Class類的的getResource或者getResourceAsStream方法時,傳入的字符串如果不以“/”開頭,則為資源文件相對于當前class的文件的相對路徑;如果傳入的字符串以“/”開頭,則為資源文件相對于jar根目錄的相對路徑。
package book.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
/**
* 序列化和反序列化對象
*/
public class SerializeObject {
// 一個內部類,用于被序列化和反序列化。
//一定要實現Serializable才能夠被序列化和反序列化。
static class MyClass implements Serializable{
//一般的實例變量會被序列化和反序列化
private int a,b;
//transient實例變量 不會 被序列化和反序列化
private transient int c;
// 類變量 不會 被序列化和反序列化
private static int d;
public MyClass(){
}
public MyClass(int a, int b, int c, int d){
this.a = a;
this.b = b;
this.c = c;
MyClass.d = d;
}
public String toString(){
return this.a + " " + this.b + " " + this.c + " " + MyClass.d;
}
}
/**
* 序列化對象到文件
*/
public static void serialize(String fileName) throws Exception{
//創建一個對象輸出流,將對象輸出到文件
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
//序列化一個字符串對象到文件
out.writeObject("Today:");
//序列化當前日期對象到文件
out.writeObject(new Date());
//序列化一個MyClass對象
MyClass my1 = new MyClass(5, 6, 7, 8);
out.writeObject(my1);
out.close();
}
/**
* 從文件反序列化到對象
*/
public static void deserialize(String fileName) throws Exception{
//創建一個對象輸入流,從文件讀取對象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
//注意讀對象時必須按照序列化對象時的順序讀,否則會出錯
//讀取字符串對象
String today = (String)(in.readObject());
System.out.println(today);
//讀日期對象
Date date = (Date)(in.readObject());
System.out.println(date.toString());
//讀MyClass對象,并調用它的add方法。
MyClass my1 = (MyClass)(in.readObject());
System.out.println(my1.toString());
in.close();
//當恢復對象的時候,對象中的所有域被自動的恢復。如果不希望某個域被序列化,可以在它前面
//加上transient關鍵字,例如下面的代碼:transient int noSer = 0;
//類似的,如果類中的某個域為靜態,它不會被序列化。
}
/**
* @param args
*/
public static void main(String[] args) throws Exception{
String fileName = "c:/temp/MyClass.ser";
SerializeObject.serialize(fileName);
//注釋掉第二行,只運行下面一行,將會發現輸出不同
SerializeObject.deserialize(fileName);
}
}
--
學海無涯