說(shuō)數(shù)據(jù)持久化,初學(xué)者可能還不太懂;但要說(shuō)把數(shù)據(jù)保存到文件,這誰(shuí)都懂了。為什么說(shuō)持久化就是把數(shù)據(jù)保存到文件?持久化指的就是當(dāng)程序退出后,其中的數(shù)據(jù)能夠保留下來(lái),供程序再次運(yùn)行的時(shí)候使用。這些數(shù)據(jù)保留在什么地方最好呢?當(dāng)然是文件里。
保存到文件是數(shù)據(jù)持久化最常用的方式,除此之外,還可以把數(shù)據(jù)保存到數(shù)據(jù)庫(kù),或者發(fā)送到其它機(jī)器,這都是持久化。不過(guò)保存在文件是最簡(jiǎn)單的方式。具體來(lái)說(shuō)就是:選取需要保存的數(shù)據(jù),按照一定的格式組織起來(lái),然后寫(xiě)入文件。下面是一個(gè)簡(jiǎn)單的例子:
- import java.io.*;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- /**
- * 持久化示例。如何將內(nèi)存中的數(shù)據(jù)保存起來(lái),并沒(méi)有一定的格式,任何人
- * 都可以根據(jù)自己的喜好來(lái)制定。持久化需要文件操作,所以請(qǐng)務(wù)必先弄懂
- * 如何讀寫(xiě)文件。
- */
- public class Persistant {
- // 文件名可隨意指定,你可以用文本編輯器打開(kāi)這個(gè)文件(注意,記事本無(wú)法處理?yè)Q行)
- static String filename = "persons.data";
- public static void main(String[] args) throws Exception {
- // 將這個(gè)程序運(yùn)行兩遍。
- // 第一遍它會(huì)創(chuàng)建一些 Person 對(duì)象并保存到文件;
- // 第二遍它會(huì)從文件中讀取對(duì)象數(shù)據(jù)并顯示出來(lái)。
- if (!new File(filename).exists()) {
- createAndSave();
- } else {
- readAndShow();
- }
- }
- // 生成并保存 Person 對(duì)象
- private static void createAndSave() throws IOException {
- List<Person> persons = createPersons();
- savePersons(persons);
- }
- // 讀取并顯示 Person 對(duì)象
- private static void readAndShow() throws IOException {
- List<Person> persons = readPersons();
- showPersons(persons);
- }
- // 創(chuàng)建要保存的 Person 對(duì)象
- private static List<Person> createPersons() {
- List<Person> result = new ArrayList<Person>();
- result.add(new Person("張三", new Date(), true));
- result.add(new Person("李四", new Date(), false));
- result.add(new Person("王五", new Date(), true));
- return result;
- }
- // 保存 Person 對(duì)象到文件。保存格式為:
- // 1、每個(gè) Person 一行
- // 2、每行依次存放 name、birthday、male 三個(gè)屬性值,用 tab 隔開(kāi)
- // 3、birthday 屬性保存的是毫秒數(shù),male 屬性保存的是字符串
- private static void savePersons(List<Person> persons) throws IOException {
- // 生成文件內(nèi)容
- String data = "";
- for (Person person : persons) {
- data += getPersonString(person) + "\n";
- }
- // 保存文件內(nèi)容
- FileWriter writer = new FileWriter(filename);
- writer.write(data);
- writer.close();
- System.out.println("對(duì)象保存完畢。");
- }
- private static String getPersonString(Person person) {
- return person.getName() + "\t" + person.getBirthday().getTime() + "\t" + person.isMale();
- }
- // 從文件中讀取 Person 對(duì)象
- private static List<Person> readPersons() throws IOException {
- List<Person> result = new ArrayList<Person>();
- BufferedReader reader = new BufferedReader(new FileReader(filename));
- String line;
- while ((line = reader.readLine()) != null) {
- result.add(getPersonFromString(line));
- }
- return result;
- }
- // 通過(guò)一行文件內(nèi)容生成一個(gè) Person 對(duì)象
- private static Person getPersonFromString(String line) {
- String[] parts = line.split("\t"); // 獲取被分隔的三個(gè)部分
- return new Person(
- parts[0], // 姓名
- new Date(Long.parseLong(parts[1])), // 出生日期
- Boolean.parseBoolean(parts[2]) // 是否為男性
- );
- }
- // 顯示 Person 對(duì)象
- private static void showPersons(List<Person> persons) {
- for (Person person : persons) {
- System.out.println(person.getName() + ", " +
- person.getBirthday() + ", " +
- (person.isMale() ? "男" : "女"));
- }
- }
- }
- // 要持久化的類(lèi)
- class Person {
- private String name; // 姓名
- private Date birthday; // 生日
- private boolean male; // true 表示男性,false 表示女性
- Person(String name, Date birthday, boolean male) {
- this.name = name;
- this.birthday = birthday;
- this.male = male;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public boolean isMale() {
- return male;
- }
- public void setMale(boolean male) {
- this.male = male;
- }
- }
轉(zhuǎn):http://blog.csdn.net/YidingHe/archive/2009/03/09/3971073.aspx