騎豬闖天下

          J2ME隨筆,記錄成長的腳步

          統計

          留言簿(3)

          閱讀排行榜

          評論排行榜

          [J2ME] 以對象的方式操作RMS

          原則上來說,手機上盡量不允許大批量的操作RMS,但目前這個項目是一個閱讀軟件,不得不把下載到的書存到手機中,這就要反復操作RMS,項目期間出現過很多問題,現把幾個主要的思想記錄下來,以供在以后的項目中做為參考。

          1.通過對已下載數據的RMS存儲,可以實現文件的斷點續傳;
          2.通過對下載列表的記錄,可以實現已下載、正在下載、暫停,等待下載等的區分;
          3.因為是反復操作RMS,所以對內存的回收一定要注意,操作結束立刻要回收;
          4.因為是反復操作RMS,所以每次有設計到RMS有關的操作,必然遍歷已下載或比較書名等,都要先讀取下RMS;
          5.Symbian S40系統的RMS非常有限,大致為1-2百k,不適合大數據存儲,S60理論上沒有限制,但存到20M時,有的機子會出問題;
          6.本代碼范例為以對象的方式反復操作RMS,如果小范圍內使用RMS,如只記錄下用戶名密碼等,是不需要這么負責的代碼的;


          代碼范例:
          package com.xuudoo.booking;

          import
           java.io.ByteArrayInputStream;
          import
           java.io.ByteArrayOutputStream;
          import
           java.io.DataInputStream;
          import
           java.io.DataOutputStream;
          import
           java.io.IOException;
          import
           java.io.InputStream;
          import
           javax.microedition.rms.RecordStore;

          import
           com.xuudoo.ewl.EWLScreen;

          public final class RMSRecorderIfno 
          {
              
          private
           ByteArrayOutputStream dis;
              
          private
           ByteArrayInputStream is;
              
          private
           DataOutputStream dis1;
              
          private
           DataInputStream is1;
              
          public
           RecordStore rs;
              
          private
           String rmsName;
              
          public boolean
           boon;
              
          private static long
           length;
              
          private static boolean istrue = false
          ;

              
          /**
               *     RMS命名規則:
               *     RecordStore.openRecordStore(storeName, false);
               * 
               *  
          @param storeName= "002_" + bookName + "_packet";//
               *    
          @param
           storeName= "002_" + bookName + "_mgz";    //存儲書
               *    
          @param
           storeName= "002_" + bookName + "_info";    //
               *    
          @param
           storeName= "002_" + bookName + "_file";    //
               *    
          @param
           storeName= "002_" + bookName + "_byte";    //存儲每塊數據中的廢字節數
               *    
          @param
           storeName= "002_" + bookName + "_url";    //存儲url和一本書的總數據塊數
               *    
          @param
           storeName= "002_" + "downloaded";        //存儲已經下載結束書的ID
               *    
          @param
           storeName= "002_" + "downloadpause";        //存儲暫停下載書的ID
               
          */

              
          public RMSRecorderIfno() {
                  
          if (!istrue) 
          {
                      istrue 
          = true
          ;
                      length 
          =
           getAvailable();
                  }

              }


              
          /**
               * 打開一個倉儲
               * 
          @param name:倉儲名字
               * 
          @param
           flag:值為true,當不存在時創建一個新的store
               * 
          @return

               
          */

              
          public final boolean open(String name, boolean flag) {
                  
          try 
          {
                      rmsName 
          =
           name;
                      rs 
          =
           RecordStore.openRecordStore(rmsName, flag);
                      rs.setMode(
          0true
          );
                      boon 
          = true
          ;
                  }
           catch (Exception e) {
                      e.printStackTrace();
                      
          return false
          ;
                  }

                  
          return true;
              }


              
          public final void openWriteStream() {
                  dis 
          = new
           ByteArrayOutputStream();
                  dis1 
          = new
           DataOutputStream(dis);
              }

              
              
          public final void closeWriteStream() {
                  
          try 
          {
                      
          if (dis1 != null)
          {
                          dis1.close();
                          dis1 
          = null
          ;
                      }

                      
          if (dis != null{
                          dis.close();
                          dis 
          = null
          ;
                      }

                  }
           catch (IOException e) {
                      e.printStackTrace();
                  }

              }


              
          public final void write(int k) {
                  
          try 
          {
                      dis1.writeInt(k);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public final void write(byte data[]) {
                  
          try 
          {
                      dis1.write(data);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public final void write(boolean flag) {
                  
          try 
          {
                      dis1.writeBoolean(flag);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public final void write(String s) {
                  
          try 
          {
                      dis1.writeUTF(s);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public final void write(short word0) {
                  
          try 
          {
                      dis1.writeShort(word0);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public final byte[] saveStreamToByteArray() {
                  
          try 
          {
                      dis1.flush();
                  }
           catch (Exception exception) 
          {
                      exception.printStackTrace();
                  }

                  
          return dis.toByteArray();
              }


              
          /**
               * 讀取位置K的數據
               * 
          @param k
               * 
          @return

               
          */

              
          public final boolean openReadStream(int k) {
                  
          try 
          {
                      is 
          = new
           ByteArrayInputStream(getRecord(k));
                      is1 
          = new
           DataInputStream(is);
                  }
           catch (Exception _ex) {
                      
          if
          (BookingMidlet.DEBUG)
                          _ex.printStackTrace();
                      
          return false
          ;
                  }

                  
          return true;
              }


              
          /**
               * 讀取整數值
               * 
          @return
               
          */

              
          public final int readInt() {
                  
          try 
          {
                      
          return
           is1.readInt();
                  }
           catch (Exception exception) {
                      
          if
          (BookingMidlet.DEBUG)
                          exception.printStackTrace();
                      
          return 0
          ;
                  }

              }


              
          public final boolean readBoolean() {
                  
          try 
          {
                      
          return
           is1.readBoolean();
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                      
          return false
          ;
                  }

              }


              
          public final String readString() {
                  
          try 
          {
                      
          return
           is1.readUTF();
                  }
           catch (Exception exception) {
                      
          return null
          ;
                  }

              }


              
          /**
               * 返回數據庫中的記錄條數
               * 
          @return
               
          */

              
          public final int size() {
                  
          try 
          {
                      
          return
           rs.getNumRecords();
                  }
           catch (Exception e) {
                      
          if(BookingMidlet.DEBUG)
          {
                          e.printStackTrace();
                      }

                      
          return -1;
                  }

              }


              
          public final void setRecord(int k, byte abyte[]) {
                  
          try 
          {
                      rs.setRecord(k, abyte, 
          0
          , abyte.length);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public final int addRecord(byte abyte0[]) {
                  
          try 
          {
                      
          return rs.addRecord(abyte0, 0
          , abyte0.length);
                  }
           catch (Exception e) {
                      
          if(rs != null)
          {
                          UIManager.showAlert(
          "下載失敗,儲存器已滿,請及時清理"
          );
                      }

                      
          if(UIManager._instance.downloadtool != null && UIManager._instance.downloadtool.conn != null){
                          UIManager._instance.downloadtool.CloseMidlet();
                          UIManager._instance.removeDownloadingItem(UIManager._instance.downloadtool.item);
                          UIManager._instance.removeDownloadedItem(UIManager._instance.downloadtool.item);
                          delete(
          "002_" + UIManager._instance.downloadtool.imageName + "_byte"
          );
                          delete(
          "002_" + UIManager._instance.downloadtool.imageName + "_url"
          );
                          
          if(UIManager._instance.downloadtool.rms != null)
          {
                              UIManager._instance.downloadtool.rms.close();
                              UIManager._instance.downloadtool.rms 
          = null
          ;
                          }

                          delete(
          "002_" + UIManager._instance.downloadtool.imageName + "_mgz");
                          
          if
          (BookingMidlet.DEBUG)
                              EWLScreen.prompt2 
          = "出錯了,請注意!!"
          ;
                      }

                      
          return -1;
                  }

              }


              
          /**
               * 讀取位置K上的字節數組數據
               * 
          @param k
               * 
          @return

               
          */

              
          public final byte[] getRecord(int k) {
                  
          try 
          {
                      
          return
           rs.getRecord(k);
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                      exception.printStackTrace();
                      
          return null
          ;
                  }

              }


              
          public final void close() {
                  
          try 
          {
                      
          if (dis1 != null
          {
                          dis1.close();
                          dis1 
          = null
          ;
                      }

                      
          if (dis != null{
                          dis.close();
                          dis 
          = null
          ;
                      }

                      
          if (is1 != null{
                          is1.close();
                          is1 
          = null
          ;
                      }

                      
          if (is != null{
                          is.close();
                          is 
          = null
          ;
                      }

                      
          if (rs != null{
                          boon 
          = false
          ;
                          rs.closeRecordStore();
                          rs 
          = null
          ;
                          
          return
          ;
                      }

                  }
           catch (Exception _ex) {
                      _ex.printStackTrace();
                  }

              }


              
          public static final void delete(String s) {
                  
          try 
          {
                      RecordStore.deleteRecordStore(s);
                      
          return
          ;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public static final boolean a(long l) {
                  
          if (l > 0L && l < length) 
          {
                      length 
          -=
           l;
                      
          return true
          ;
                  }
           else {
                      
          return false
          ;
                  }

              }


              
          public static final boolean b(long l) {
                  
          if (l > 0L && length + l <= getAvailable()) 
          {
                      length 
          +=
           l;
                      
          return true
          ;
                  }
           else {
                      
          return false
          ;
                  }

              }


              
          public static final long h() {
                  
          return
           length;
              }


              
          public static final long getAvailable() {
                  
          long
           l;
                  RecordStore recordstore;
                  
          try 
          {
                      l 
          = (recordstore = RecordStore.openRecordStore("freeMemory"true
          )).getSizeAvailable();
                      recordstore.closeRecordStore();
                      
          return
           l;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                      
          return 0L
          ;
                  }

              }


              
          public static final String[] getList() {
                  
          try 
          {
                      
          return
           RecordStore.listRecordStores();
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                      
          return null
          ;
                  }

              }


              
          public static final boolean exists(String name) {
                  String rmslistname[] 
          =
           getList();
                  
          try 
          {
          //            rs = RecordStore.openRecordStore(name, false);

                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

                  
          if (rmslistname == null)
                      
          return false
          ;
                  
          for (int k = 0; k < rmslistname.length; k++
          )
                      
          if
           (rmslistname[k].equals(name))
                          
          return true
          ;
                  
          return false
          ;
              }


              
          public static final synchronized void a(String s, int k) {
                  
          //   Object obj1 = null;

                  try {
                      ByteArrayOutputStream bytearrayoutputstream 
          = new
           ByteArrayOutputStream();
                      DataOutputStream obj 
          = new
           DataOutputStream(bytearrayoutputstream);
                      obj.writeInt(k);
                      a(s, bytearrayoutputstream.toByteArray());
                      
          if (obj != null
          )
                          ((DataOutputStream) (obj)).close();
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                  }

              }


              
          public static final synchronized void a(String s, byte abyte0[]) {
                  Object obj 
          = null
          ;
                  
          try 
          {
                      
          if (((RecordStore) (obj = RecordStore.openRecordStore(s, true))).getNumRecords() == 0
          )
                          ((RecordStore) (obj)).addRecord(abyte0, 
          0
          , abyte0.length);
                      ((RecordStore) (obj)).setRecord(
          1, abyte0, 0
          , abyte0.length);

                      
          if (obj != null
          )
                          ((RecordStore) (obj)).closeRecordStore();

                      
          return
          ;
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }


              
          public static final synchronized boolean d(String s) {
                  String as[];
                  
          if ((as = RecordStore.listRecordStores()) == null
          )
                      
          return false
          ;
                  
          for (int k = 0; k < as.length; k++
          )
                      
          if
           (as[k].equals(s))
                          
          return true
          ;

                  
          return false
          ;
              }


              
          public static final synchronized int e(String s) {
                  System.out.println(
          "bn.e(string) s=" +
           s);
                  Object obj;
                  obj 
          = null
          ;
                  
          //     Object obj1 = null;

                  int k;
                  
          try 
          {
                      obj 
          = new
           ByteArrayInputStream(f(s));
                      DataInputStream datainputstream;
                      datainputstream 
          = new
           DataInputStream((InputStream) (obj));
                      k 
          =
           datainputstream.readInt();
                      ((ByteArrayInputStream) (obj)).close();

                      
          return
           k;
                  }
           catch (Exception exception) {
                      
          try 
          {
                          
          if (obj != null
          )
                              ((ByteArrayInputStream) (obj)).close();
                      }
           catch (Exception ex) {
                          ex.printStackTrace();
                      }

                      exception.printStackTrace();
                      
          return 0;
                  }

              }


              
          public static final synchronized byte[] f(String s) {
                  System.out.println(
          "bn.f(string) s=" +
           s);
                  
          byte abyte0[] = (byte[]) null
          ;
                  
          try 
          {
                      RecordStore obj 
          = RecordStore.openRecordStore(s, true
          );
                      
          if (obj.getNumRecords() == 1
          )
                          abyte0 
          = ((RecordStore) (obj)).getRecord(1
          );
                      
          if (obj != null
          )
                          obj.closeRecordStore();

                      
          return
           abyte0;
                  }
           catch (Exception exception) {
                      exception.printStackTrace();
                      
          return null
          ;
                  }

              }


          }

          posted on 2010-02-25 16:41 騎豬闖天下 閱讀(295) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 瓦房店市| 隆安县| 竹溪县| 岳阳县| 皮山县| 海口市| 阳城县| 滕州市| 余庆县| 鹿邑县| 城固县| 遵义县| 彭州市| 石棉县| 台中市| 甘南县| 民县| 汝州市| 赤峰市| 广宗县| 乐亭县| 蓝田县| 会昌县| 白山市| 丰原市| 顺昌县| 三河市| 株洲县| 汽车| 广饶县| 清涧县| 金华市| 保康县| 巴南区| 高阳县| 稷山县| 朝阳市| 晋城| 涟水县| 怀宁县| 商水县|