J2ME的重要功能簡介1_JSP教程
推薦:J2ME及其基本慨念如果您曾經http://www.javasoft.com ;網站上查詢有關Java 2 Micro Edition 的資料,十之八九會被一大堆的技術名詞搞的一頭霧水。 什么 KVM ,什么CLDC 、CDC 、MIDP ,后面面還冒出了P
持久數據和記錄管理系統( Record Management System,簡稱 RMS)
MIDP提供在移動設備上存儲持久數據的支持,并且 MID簡表還特意規定兼容的移動設備必須提供至少 8KB的非動態內存用于數據存儲的用途,時式上,大多數的 MIDP Java設備提供的空間比這要求多得多。這就允許一個midlet充份利用應用程序的持久數據。對于有 Java 2標準版開發經驗的開發者,應該注意這種數據存儲能力與標準的 Java有區別。J2ME記錄管理系統 ( RMS )允許數據流被儲存并且在一個記錄基礎上訪問數據。由應用程序開發者把每個記錄解析到字段水平。RMS程序包內部的接口支持一個應用程序定義的基礎上的比較與檢索功能。
一、javax.microedition.rms程序包
通過 javax.microedition.rms包訪問 J2ME記錄管理系統,這個包包括一個類, RecordStore,和好幾個有用的接口 (在下列表格中描述 ):
接口 | 描述 |
RecordComparator | 一個接口,定義一個比較機制,比較兩個記錄(以一個實現定義的方式)看它們是否匹配或它們的相對排序次序是什么樣的。 |
RecordEnumeration | 一個接口,一個雙向的紀錄模擬器 |
RecordFilter | 一個接口,定義了一個過濾器用于檢查一個記錄,看其是否匹配 (基于一種應用程序定義的標準 )。 |
RecordListener | 一個監聽者接口,從一個記錄存儲器中接受記錄更改/添加/刪除事件。 |
這些接口對于實現自定義搜索和檢索功能很有用,這些接口中使用的最多的就是 RecordEnumeration。這個接口從 RecordStore.enumerateRecords()方法調用中返回并且被用于遍歷一組從記錄存儲器中返回的記錄。它包含 nextRecord()、 previousRecord()、 numRecords()和 hasNextElement()等方法。
二、使用RecordStore類訪問記錄存儲
RecordStore類是開發者開發基層 RMS的接口,記錄儲存是在一個平臺--midlet環境依賴的方式--上創建的。信息的實際的位置和存儲細節應用程序開發者其實并不知道,記錄存儲可以使用一種簡單的命名規則來訪問:名稱最多可以到32個Unicode字符長度,區分大小寫和必須在一個 midlet套件內唯一。在一個 midlet套件內的所有 midlet都有讀/寫一個記錄存儲的權限,只要它們知道正確的名稱。一旦這個 midlet套件被從該設備上刪除,所有與這個套件關聯的記錄存儲也將被刪除。
比如說,為了打開一個名為 TestRecordSet的記錄存儲,你可以調用 RecordStore.openRecordStore()方法。這個方法使用兩個參數:一個字符串,表示記錄存儲的名稱;一個布爾值,如果為真的話,就會在紀錄存儲不存在時創建一個。我們使下列方法調用創建新的 TestRecordSet記錄存儲:
RecordStore rs = null; rs = RecordStore.openRecordStore("TestRecordSet", true); |
記錄存儲被創建好后,我們可以通過調用 RecordStore.addRecord()方法來向這個記錄存儲添加數據。addRecord()接受三個參數:
參數 | 描述 |
byte[] data | 一個儲存在記錄中的字節數據數組,通過 java.io.ByteArrayOutputStream和 java.io.DataOutputStream類把數據添加到這個字節數組。 |
int offset | 進入這個記錄第一個關聯字節數據緩沖區的索引。 |
int numBytes | 用于記錄的數據緩沖區的字節數 |
一旦成功完成 addRecord()調用 ,這個方法就返回一個整數指定這個記錄在記錄存儲中的標識號。 RecordStore還規定另外一個數據編輯方法,包括 setRecord()和 deleteRecord(),但是我在例子中不會使用它們。
三、構建一個用于J2ME設備的通訊錄
這個例子構造一個基本的通訊錄應用程序,使用它用戶就可以從一個移動設備上查看聯絡資料。現在我只介紹從本地設備中存儲的數據中讀出相關的聯絡資料,在本文稍后的部分,你將看到如何使用J2ME網絡功能從一個 Web服務器取回數據文件!用戶將能查看一個地址列表和從這個列表選擇一個地址。為了實現這個目標,我們要創建兩個類,從用戶界面邏輯中把數據存取邏輯分開的: AddressDB類封裝所有的 RMS代碼; AddressBookMIDLet類封裝 GUI代碼。AddressDB類的代碼如下:
import javax.microedition.rms.*;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; public class AddressDB { private static RecordStore rs = null; public AddressDB() { try { rs = RecordStore.openRecordStore("addressbook", true); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public void addAddress(String Name, String Address) { ByteArrayOutputStream os = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(os); try { output.writeUTF(Name "," Address); } catch (IOException e) { System.out.println(e); e.printStackTrace(); } byte[] b = os.toByteArray(); try { rs.addRecord(b, 0, b.length); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public static String getName(int index) { int counter = 1; int commalocation = 0; String name = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); name = strTemp.substring(2, commalocation); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return name; } public static String getAddress(int index) { int counter = 1; int commalocation = 0; String address = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); address = strTemp.substring(commalocation 1); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return address; } public static int recordCount() { int count = 0; try { count = rs.getNumRecords(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return count; } } |
AddressDB類包含好幾個 public訪問方法,它們都對來自外部調用者的訪問隱藏記錄存儲的細節。AddressDB()構造程序調用 RecordStore.openRecordStore(),正如前面討論的那樣。我也創建了四個助手方法用于訪問基層記錄存儲: recordCount()、 getAddress()、 getName()和 addAddress()。注意,在本例子中addAddress()方法只是在 name/address字段之間放了一個逗號。同樣地, getAddress()和getName()從記錄存儲中取回 name/address字段。
持久數據和記錄管理系統( Record Management System,簡稱 RMS)
MIDP提供在移動設備上存儲持久數據的支持,并且 MID簡表還特意規定兼容的移動設備必須提供至少 8KB的非動態內存用于數據存儲的用途,時式上,大多數的 MIDP Java設備提供的空間比這要求多得多。這就允許一個midlet充份利用應用程序的持久數據。對于有 Java 2標準版開發經驗的開發者,應該注意這種數據存儲能力與標準的 Java有區別。J2ME記錄管理系統 ( RMS )允許數據流被儲存并且在一個記錄基礎上訪問數據。由應用程序開發者把每個記錄解析到字段水平。RMS程序包內部的接口支持一個應用程序定義的基礎上的比較與檢索功能。
一、javax.microedition.rms程序包
通過 javax.microedition.rms包訪問 J2ME記錄管理系統,這個包包括一個類, RecordStore,和好幾個有用的接口 (在下列表格中描述 ):
接口 | 描述 |
RecordComparator | 一個接口,定義一個比較機制,比較兩個記錄(以一個實現定義的方式)看它們是否匹配或它們的相對排序次序是什么樣的。 |
RecordEnumeration | 一個接口,一個雙向的紀錄模擬器 |
RecordFilter | 一個接口,定義了一個過濾器用于檢查一個記錄,看其是否匹配 (基于一種應用程序定義的標準 )。 |
RecordListener | 一個監聽者接口,從一個記錄存儲器中接受記錄更改/添加/刪除事件。 |
這些接口對于實現自定義搜索和檢索功能很有用,這些接口中使用的最多的就是 RecordEnumeration。這個接口從 RecordStore.enumerateRecords()方法調用中返回并且被用于遍歷一組從記錄存儲器中返回的記錄。它包含 nextRecord()、 previousRecord()、 numRecords()和 hasNextElement()等方法。
二、使用RecordStore類訪問記錄存儲
RecordStore類是開發者開發基層 RMS的接口,記錄儲存是在一個平臺--midlet環境依賴的方式--上創建的。信息的實際的位置和存儲細節應用程序開發者其實并不知道,記錄存儲可以使用一種簡單的命名規則來訪問:名稱最多可以到32個Unicode字符長度,區分大小寫和必須在一個 midlet套件內唯一。在一個 midlet套件內的所有 midlet都有讀/寫一個記錄存儲的權限,只要它們知道正確的名稱。一旦這個 midlet套件被從該設備上刪除,所有與這個套件關聯的記錄存儲也將被刪除。
比如說,為了打開一個名為 TestRecordSet的記錄存儲,你可以調用 RecordStore.openRecordStore()方法。這個方法使用兩個參數:一個字符串,表示記錄存儲的名稱;一個布爾值,如果為真的話,就會在紀錄存儲不存在時創建一個。我們使下列方法調用創建新的 TestRecordSet記錄存儲:
RecordStore rs = null; rs = RecordStore.openRecordStore("TestRecordSet", true); |
記錄存儲被創建好后,我們可以通過調用 RecordStore.addRecord()方法來向這個記錄存儲添加數據。addRecord()接受三個參數:
參數 | 描述 |
byte[] data | 一個儲存在記錄中的字節數據數組,通過 java.io.ByteArrayOutputStream和 java.io.DataOutputStream類把數據添加到這個字節數組。 |
int offset | 進入這個記錄第一個關聯字節數據緩沖區的索引。 |
int numBytes | 用于記錄的數據緩沖區的字節數 |
一旦成功完成 addRecord()調用 ,這個方法就返回一個整數指定這個記錄在記錄存儲中的標識號。 RecordStore還規定另外一個數據編輯方法,包括 setRecord()和 deleteRecord(),但是我在例子中不會使用它們。
三、構建一個用于J2ME設備的通訊錄
這個例子構造一個基本的通訊錄應用程序,使用它用戶就可以從一個移動設備上查看聯絡資料。現在我只介紹從本地設備中存儲的數據中讀出相關的聯絡資料,在本文稍后的部分,你將看到如何使用J2ME網絡功能從一個 Web服務器取回數據文件!用戶將能查看一個地址列表和從這個列表選擇一個地址。為了實現這個目標,我們要創建兩個類,從用戶界面邏輯中把數據存取邏輯分開的: AddressDB類封裝所有的 RMS代碼; AddressBookMIDLet類封裝 GUI代碼。AddressDB類的代碼如下:
import javax.microedition.rms.*;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; public class AddressDB { private static RecordStore rs = null; public AddressDB() { try { rs = RecordStore.openRecordStore("addressbook", true); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public void addAddress(String Name, String Address) { ByteArrayOutputStream os = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(os); try { output.writeUTF(Name "," Address); } catch (IOException e) { System.out.println(e); e.printStackTrace(); } byte[] b = os.toByteArray(); try { rs.addRecord(b, 0, b.length); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public static String getName(int index) { int counter = 1; int commalocation = 0; String name = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); name = strTemp.substring(2, commalocation); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return name; } public static String getAddress(int index) { int counter = 1; int commalocation = 0; String address = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); address = strTemp.substring(commalocation 1); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return address; } public static int recordCount() { int count = 0; try { count = rs.getNumRecords(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return count; } } |
AddressDB類包含好幾個 public訪問方法,它們都對來自外部調用者的訪問隱藏記錄存儲的細節。AddressDB()構造程序調用 RecordStore.openRecordStore(),正如前面討論的那樣。我也創建了四個助手方法用于訪問基層記錄存儲: recordCount()、 getAddress()、 getName()和 addAddress()。注意,在本例子中addAddress()方法只是在 name/address字段之間放了一個逗號。同樣地, getAddress()和getName()從記錄存儲中取回 name/address字段。
分享:J2ME基礎知識一、J2ME中需要的Java基礎知識 現在有大部分人,都是從零開始學J2ME的,學習J2ME的時候,總是從Java基礎開始學習,而且現在講Java基礎的書籍中都是以J2SE來講基礎,這就給學習造成
- jsp response.sendRedirect不跳轉的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復習整理
- JSP腳本元素和注釋復習總結示例
- JSP FusionCharts Free顯示圖表 具體實現
- 網頁模板:關于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數據庫的配置方法
- JDBC連接Access數據庫的幾種方式介紹
- 網站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關鏈接:
- 教程說明:
JSP教程-J2ME的重要功能簡介1。