posts - 56,  comments - 12,  trackbacks - 0

          Java中除了二進制文件和使用文本文件外還有基于Data的數據操作,這里的Data指的是Java的基本數據類型和String。基本數據類型包括byte、int、char、long、float、double、boolean和short。

          說到Java的基本數據類型必須談到的兩個類是DataInputStream和DataOutputStream。它們提供了對Java基本數據類型 的操作,但是這些方法事實上是在兩個重要的接口中定義的DataInput和DataOutput,它們的功能就是把二進制的字節流轉換成Java的基本 數據類型,同時還提供了從數據中使用UTF-8編碼構建String的功能。有一個重要的類RandomAccessFile實現了DataInput和DataOutput兩個接口使得他能夠對文件同時進行寫和讀的操作。

          在DataInputStream和DataOutputStream兩個類中的方法都很簡單,基本結構為readXXXX()和writeXXXX ()其中XXXX代表基本數據類型或者String。在這里不多講述,不過值得一提的是我們有必要讀讀java中unicode的編碼規則,在API doc中有比較詳細的介紹。通常我們的對象有很多都是由java的基本數據類型構成的,比如一個人的信息包括姓名,電子信箱,電話號碼和性別等。其實我們 可以用DataInputStream中的方法和DataOutputStream中的方法按照一定的序列把數據寫入流中再按照相同的序列把他們讀取出 來,這就是我們自己實現的序列化,這可以用在數據傳輸中,比如在J2ME聯網程序中使用序列化機制傳輸數據。下面我們看看如何自己實現序列化,首先我們要有兩個構造函數其中一個參數為空。

          public Account()
          {

          }

          public Account(String userName, String email, int age, boolean gender)
          {
           this.userName = userName;
           this.email = email;
           this.age = age;
           this.gender = gender;
          }

            當我們進行序列化的時候也很簡單,我們只是往DataOutputStream中按照順序寫入對象的成員變量。例如:

          public void serialize(DataOutputStream dos) throws IOException
          {
           dos.writeUTF(userName);
           dos.writeUTF(email);
           dos.writeInt(age);
           dos.writeBoolean(gender);
          }

            當我們進行反序列化的時候則按照相同的順序從DataInputStream里面讀取數據并賦值給成員變量。例如:

          public static Account deserialize(DataInputStream dis) throws IOException
          {
           Account account = new Account();
           account.userName = dis.readUTF();
           account.email = dis.readUTF();
           account.age = dis.readInt();
           account.gender = dis.readBoolean();
           return account;
          }

            為了便于調試我們還提供一個toString()的方法打印出對象的實際信息。這是個好的習慣。

          public String toString()
          {
          return "UserName = " + userName + " Email = " + email + " age = " + age + " gender = " + (gender ? "male" : "female");
          }

            為了測試序列化我們編寫下面的程序進行測試,代碼比較簡單。

          package com.j2medev.mingjava;
          import java.io.*;

          public class TestDataIO
          {
           public static void main(String[] args) throws IOException
           {
            Account account = new Account("mingjava","eric.zhan@263.net",25,true);
            System.out.println("before serialization.........");
            System.out.println(account.toString());
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            account.serialize(dos);
            DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));
            Account sAccount = Account.deserialize(dis);
            System.out.println("after serialization..........");
            System.out.println(sAccount.toString());
            dos.close();
            dis.close();
           }
          }

          package com.j2medev.mingjava;
          import java.io.*;

          public class Account
          {
           private String userName = "";
           private String email = "";
           private int age = 0;
           private boolean gender = false;

           public Account()
           {}

           public Account(String userName, String email, int age, boolean gender)
           {
            this.userName = userName;
            this.email = email;
            this.age = age;
            this.gender = gender;
           }

           public void serialize(DataOutputStream dos) throws IOException
           {
            dos.writeUTF(userName);
            dos.writeUTF(email);
            dos.writeInt(age);
            dos.writeBoolean(gender);
           }

           public static Account deserialize(DataInputStream dis) throws IOException
           {
            Account account = new Account();
            account.userName = dis.readUTF();
            account.email = dis.readUTF();
            account.age = dis.readInt();
            account.gender = dis.readBoolean();
            return account;
           }

           public String toString()
           {
            return "UserName = " + userName + " Email = " + email + " age = " + age + " gender = " + (gender ? "male" : "female");
           }
          }

            編譯運行程序在控制臺輸出:

          before serialization.........
          UserName = mingjava Email = eric.zhan@263.net age = 25 gender = male
          after serialization..........
          UserName = mingjava Email = eric.zhan@263.net age = 25 gender = male

            序列化成功,后面我將講述如何在J2ME聯網中使用序列化機制。
          posted on 2007-01-18 23:53 苦笑枯 閱讀(237) 評論(0)  編輯  收藏 所屬分類: Java
          收藏來自互聯網,僅供學習。若有侵權,請與我聯系!

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(2)

          隨筆分類(56)

          隨筆檔案(56)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 连城县| 措勤县| 安泽县| 商城县| 章丘市| 高雄市| 云龙县| 高清| 鹤壁市| 余庆县| 贞丰县| 巴林左旗| 南丰县| 驻马店市| 孟州市| 西峡县| 菏泽市| 建阳市| 黑龙江省| 林西县| 嘉峪关市| 合阳县| 姜堰市| 大名县| 监利县| 定兴县| 玉山县| 溧水县| 巫山县| 池州市| 上林县| 鄂温| 浮梁县| 岑巩县| 福海县| 崇明县| 厦门市| 民县| 津市市| 华容县| 定陶县|