04 J2ME Persistent Storage

合集下载

J2ME程序设计实例教程(第01章)

J2ME程序设计实例教程(第01章)


打包MIDP应用程序,并发布到Web服务器 打包 应用程序,并发布到 服务器 应用程序 启动模拟器,安装 启动模拟器,安装MIDP应用程序 应用程序
(教材 ,例子 教材P6,例子1-1) )
1.4 MIDP应用程序 应用程序
MIDP应用程序是由若干个类所组成的,其中必须有 应用程序是由若干个类所组成的, 应用程序是由若干个类所组成的 一个类继承来自javax.microedition.midlet包中 一个类继承来自 包中 的抽象类MIDlet,这个类被称为应用程序的主类。运 的抽象类 ,这个类被称为应用程序的主类。 行时,移动信息设备上预置的Java应用管理器(Java 应用管理器( 行时,移动信息设备上预置的 应用管理器 Application Manager, JAM)负责创建主类 ) 的子类) (MIDlet的子类)的实例对象。 的子类 的实例对象。
图1-4 J2ME WTK目录结构
1.3 J2ME无线工具包 无线工具包——开发 开发MIDP程序 无线工具包 开发 程序
MIDP应用程序的开发过程: 应用程序的开发过程: 应用程序的开发过程
1.创建新项目 2.编写 编写MIDP应用程序 应用程序 3.编译、预校验 编译、 4.在模拟器上运行、调试 在模拟器上运行、 5.打包、发布应用程序 打包、
MIDlet套件(MIDlet Suite)是MIDP应用程序的集合,被 套件( 应用程序的集合, 套件 ) 应用程序的集合 封装成一个Jar文件。在这个文件中包含下面三部分内容。 文件。 封装成一个 文件 在这个文件中包含下面三部分内容。 实现MIDP应用程序的类文件,在一个MIDlet套件中可以有 应用程序的类文件,在一个 实现 应用程序的类文件 套件中可以有 多个MIDlet存在。 多个 存在。 存在 MIDlet所需要的资源文件,例如,图标、声音等等。 所需要的资源文件,例如,图标、声音等等。 所需要的资源文件 Jar清单文件 清单文件——MANIFEST.MF,用于描述 文件的内容。 清单文件 ,用于描述Jar文件的内容。 文件的内容 每个MIDlet套件都有一个对应的 套件都有一个对应的JAD(Java Application 每个 套件都有一个对应的 ( Descriptor,Java应用描述器)文件,用来描述 应用描述器) , 应用描述器 文件,用来描述MIDlet套件 套件 的信息。 的信息。

J2ME技术在手机游戏的发展分析毕业论文

J2ME技术在手机游戏的发展分析毕业论文

J2ME技术在手机游戏的发展分析毕业论文目录摘要....................... 错误!未定义书签。

Abstract ..................... 错误!未定义书签。

第1章绪论 (1)第2章 J2ME技术概览 (2)2.1 J2ME的概念 (2)2.2 J2ME简介 (2)2.2.1 J2ME架构 (3)2.2.2 JVM ( 虚拟机 ) (3)2.2.3 MIDP(移动信息设备简表) (4)2.3 手机游戏的发展 (5)2.3.1 目前国内的发展情况 (5)2.3.2 目前国际的发展情况 (6)第3章游戏设计的需求分析 (9)3.1 MIDP中的游戏API (9)3.2 游戏类构成 (9)3.2.1 Boxer类的实现 (10)3.2.2 GameCanvas类的功能及特点 (10)3.2.3 Sprite类的功能及特点 (11)3.3游戏角色的处理 (11)3.4 游戏中的事件处理 (12)3.4.1 key Pressed方法 (12)3.4.2 key Released方法 (13)第4章“Pocket Boxing”手机游戏开发制作 .. 144.1 游戏编程 (14)4.2 格斗类手机游戏实例 (14)4.2.1 “Pocket Boxing”游戏背景介绍及开发环境 (14)4.2.2 MIDlet的构成 (15)4.2.3 MIDlet的生命周期 (16)4.2.4 MIDlet的画面显示基础 (16)4.2.5 游戏项目的创建 (18)4.2.6 命令种类及命令处理 (19)4.2.7 游戏中的描绘处理 (21)4.2.8 游戏状态的类变量 (23)4.2.9 按键事件的处理 (24)4.2.10 设计存在的难点 (25)第5章手机游戏开发过程中的困难 (26)5.1 手机游戏开发存在的困难 (26)5.1.1 移动开发存在的问题 (27)5.1.2 操作环境不兼容性问题 (27)5.1.3 显示速度方面的问题 (28)5.1.4 不同的屏幕尺寸问题 (28)5.1.5 输入问题 (28)5.2 解决方案 (29)第6章 J2ME手机游戏前景展望 (31)6.1 J2ME手机游戏的优势 (31)6.2 J2ME手机游戏的开发意义 (32)第7章结论 (35)致谢 (36)参考文献 (37)英文资料翻译 (38)第1章绪论手机是人们日常生活中所用的非常频繁的通信工具,虽然现在其费用比有线电话高,但是其随时随地的沟通优势,使人们摆脱了线路的束缚。

两个小时精通Android开发之数据持久存储篇.

两个小时精通Android开发之数据持久存储篇.

笔者在前面的两篇文章《两个小时精通Android开发之界面篇》、《两个小时精通Android 开发之按键映射篇》分别讲了无缝移植J2ME程序到Android平台上对界面和用户按键交互所做的适配接口,原则上利用这些接口原有的J2ME程序基本不用做任何的修改就可以运行在Android平台上,所以精通J2ME也就等于精通了Android。

笔者这篇文章里要讲述的是J2ME平台和Android平台另外一个重要的不同点,那就是数据持久存储系统。

J2ME平台里采用RMS系统进行数据的持久存储,而Android平台则提供了丰富的接口进行数据的持久存储,但任何持久存储的本质无非就是数据串行化后被保存到磁盘空间上,仔细研究J2ME平台RMS系统的实现源码可以看到,J2ME是通过一个叫做RecordStoreFile的类进行数据持久化存储的,而这个RecordStoreFile类的实现如下:public class RecordStoreFile {private static SecurityToken classSecurityToken;private static final String dbExtension = ".db";private RandomAccessStream recordStream;private String myStoragePath;public static void initSecurityToken(SecurityToken token) {if (classSecurityToken != null) {return;}classSecurityToken = token;}public RecordStoreFile(String uidPath)throws IOException{RandomAccessStream newStream;myStoragePath = uidPath;newStream = new RandomAccessStream(classSecurityToken);newStream.connect(myStoragePath, Connector.READ_WRITE);recordStream = newStream;}public static String getUniqueIdPath(String fileName) {return getStoragePath(fileName);}public static String getUniqueIdPath(String vendorName, String suiteName,String fileName) {return getStoragePath(vendorName, suiteName, fileName);}public static boolean exists(String uidPath) {File file;file = new File(classSecurityToken);return file.exists(uidPath);}public static boolean deleteFile(String uidPath){File file;file = new File(classSecurityToken);try {file.delete(uidPath);return true;} catch (IOException ioe) {return false;}}public void seek(int pos) throws IOException{recordStream.setPosition(pos);}public void write(byte[] buf) throws IOException{write(buf, 0, buf.length);}public void write(byte[] buf, int offset, int numBytes) throws IOException {recordStream.writeBytes(buf, offset, numBytes);}public int read(byte[] buf) throws IOException{return read(buf, 0, buf.length);}public int read(byte[] buf, int offset, int numBytes) throws IOException {return recordStream.readBytes(buf, offset, numBytes);}public void close() throws IOException{// close recordStream if it existsif (recordStream != null) {recordStream.disconnect();recordStream = null;}}public void truncate(int size) throws IOException{if (recordStream != null) {recordStream.truncate(size);}}public static String[] listRecordStores() {return listRecordStoresForSuite(new File(classSecurityToken),getStoragePath(null), false);}private static String[] listRecordStoresForSuite(File storage,String suiteStorageRoot,boolean rawNames) {Vector files;Vector names;String file;String asciiName;files = storage.filenamesThatStartWith(suiteStorageRoot);names = new Vector();// work through list of strings from the directoryfor (int i = 0; i < files.size(); i++) {file = (String)files.elementAt(i);if (file.endsWith(dbExtension)) {if (rawNames) {names.addElement(file);} else {asciiName = file.substring(suiteStorageRoot.length(),file.length() - 3);names.addElement(File.asciiFilenameToUnicode(asciiName));}}}if (names.size() == 0) {return null;}String[] rv = new String[names.size()];names.copyInto(rv);return rv;}public static void removeRecordStoresForSuite(SecurityToken token,String suiteStorageRoot) {File storage;String[] filenames;storage = new File(token);filenames = listRecordStoresForSuite(storage, suiteStorageRoot, true);if (filenames == null) {return;}for (int i = 0; i < filenames.length; i++) {try {storage.delete(filenames[i]);} catch (IOException ioe) {// move on to the next suite}}}public static boolean suiteHasRmsData(String suiteStorageRoot) {File storage = new File(classSecurityToken);Vector files = storage.filenamesThatStartWith(suiteStorageRoot);for (int i = 0; i < files.size(); i++) {String file = (String)files.elementAt(i);if (file.endsWith(dbExtension)) {return true;}}return false;}public static int spaceAvailable(){return new File(classSecurityToken).getBytesAvailableForFiles();}private static String getStoragePath(String name){String str;MIDletSuite mSuite;StringBuffer path;mSuite = Scheduler.getScheduler().getMIDletSuite();str = mSuite.getStorageRoot();if (name != null) {path = new StringBuffer(str);// convert the unicode filename into a system acceptable stringpath.append(File.unicodeToAsciiFilename(name));path.append(dbExtension);str = path.toString();}return str;}private static String getStoragePath(String vendor, String suite,String name) {String str = File.getStorageRoot();StringBuffer path = new StringBuffer(str);if (vendor != null && suite != null) {path.append(File.unicodeToAsciiFilename(vendor));path.append('_');path.append(File.unicodeToAsciiFilename(suite));path.append('_');}if (name != null) {path.append(File.unicodeToAsciiFilename(name));path.append(dbExtension);str = path.toString();}return str;}}可见,RMS系统也是通过IO把数据串行化后存储应用程序的空间内的,绝大多数的J2ME 程序都需要利用RMS来进行数据的持久存储的,比如游戏积分、系统设置等。

J2ME开发环境的配置和J2ME框架

J2ME开发环境的配置和J2ME框架

J2ME开发环境的配置和J2ME框架2.1 JDK的安装首先本课题是Java程序的开发,就需要在电脑上首先搭建好Java开发平台,目前搭建Java的基本开发环境所需要的是JDK。

JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。

自从Java推出以来,JDK已经成为使用最广泛的Java SDK。

JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。

JDK是学好Java的第一步。

而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。

从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。

JDK里面包括:SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。

EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。

ME(J2ME),micro edtion,主要用于移动设备、嵌入式设备上的Java应用程序,从JDK 5.0开始,改名为Java ME。

SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。

EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。

ME(J2ME),micro edtion,主要用于移动设备、嵌入式设备上的Java应用程序,从JDK 5.0开始,改名为Java ME。

JDK包含的基本组件包括:(1)Javac–编译器,将源程序转成字节码(2)jar–打包工具,将相关的类文件打包成一个文件(3)Javadoc–文档生成器,从源码注释中提取文档(4)jdb–debugger,查错工具(5)Java–运行编译后的Java程序(.class后缀的)appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。

persistentstorage 和preferences-概述说明以及解释

persistentstorage 和preferences-概述说明以及解释

persistentstorage 和preferences-概述说明以及解释1.引言1.1 概述在移动应用程序开发中,持久化存储和Preferences是两个重要的概念。

持久化存储是指在设备上长期保存数据,以便在应用程序关闭后仍然可以访问。

而Preferences则是一种轻量级的数据存储方式,用于存储应用程序的配置信息和用户偏好设置。

本文将首先介绍持久化存储的概念和常见的实现方式,包括文件存储、数据库存储和SharedPreferences。

然后将详细介绍Preferences的特点和用法,并比较两者的优缺点。

最后,我们将探讨在实际应用开发中如何选择合适的存储方式,并给出一些建议。

通过本文的阐述,读者将更好地了解持久化存储和Preferences的作用和适用场景,从而在应用开发中更加灵活地运用这两种数据存储方式。

1.2 文章结构文章结构部分将主要包括以下内容:1. 引言部分(Introduction):在这一部分将简要介绍文章的背景和概述,引出文章主题和目的。

2. 正文部分(Main Content):这部分将分为三个小节,分别介绍持久化存储和Preferences的概念及应用。

3. 结论部分(Conclusion):在这一部分将总结文章的主要内容,并提出相关的应用建议,展望持久化存储和Preferences在未来的发展趋势。

1.3 目的:本文旨在深入探讨在软件开发中常用的两种数据存储方式,即持久化存储和Preferences存储。

通过对这两种存储方式的介绍和比较,帮助读者更好地理解它们的特点、优势和适用场景。

同时,本文还旨在为开发人员提供使用这两种存储方式的建议和指导,以便在实际开发中做出更合适的选择。

最终,希望通过本文的阐述,读者能够对持久化存储和Preferences存储有一个更全面和深入的了解,从而提升自身在软件开发中的实践能力和水平。

2.正文2.1 持久化存储介绍持久化存储是指将程序中的数据在应用关闭后仍然能够保留的能力。

J2ME开发环境的安装及配置

J2ME开发环境的安装及配置

35
编写hello world 程序
图2-28
选择J2ME Midlet Suite
36
编写hello world 程序
图2-30 设置类的名称
37
编写hello world 程序
图2-31
38
设置运行
编写hello world 程序
39
填写构建路径
配置Eclipse J2ME的环境
图2-23
设置字符集
31
配置Eclipse J2ME的环境
图2-24 选择WTK
32
配置Eclipse J2ME的环境
图2-25
选择WTK路径
33
配置Eclipse J2ME的环境
图2-26
安装成功界面
34
编写hello world 程序
�安装完成之后,新建一个工程测试。 �在Eclipse中,选择 “File”→“New”→“Other”→“J2ME”→“J2ME Midlet Suite”选项,单击 “Next”按钮,如图 2-28所示。
19
Eclipse下开发环境的搭建
� Eclipse是一个非常著名的集成开发工具,其自身 功能强大而易用。 � Eclipse的另一个非常重要的特点是其提供了非常 灵活的扩展能力。 � 同样,Eclipse中也包含对J2ME支持的插件( EclipseMe ),而且不止一种。
20
安装Eclipse
Agenda
1 2 3 4 5 6 7
J2ME简介 J2ME开发环境的安装及配置 开发MIDP程序 用户界面及事件处理 手机游戏项目开发介绍 数据存储 无线网络开发
1
J2ME简介
J2ME 开发环境的安装及配置

harmonyos persistentstorage 使用

harmonyos persistentstorage 使用

harmonyos persistentstorage 使用标题:深入理解与使用HarmonyOS的PersistentStorageHarmonyOS,作为华为推出的全场景分布式操作系统,以其独特的设计理念和强大的功能特性,正在逐步影响并改变着全球的操作系统格局。

其中,PersistentStorage是HarmonyOS中一项重要的数据存储技术,它提供了持久化数据存储的能力,使得应用程序可以在设备重启或者应用程序关闭后仍然保留其数据。

本文将详细解析PersistentStorage的使用方法和步骤。

一、理解PersistentStoragePersistentStorage,即持久化存储,是HarmonyOS为应用程序提供的本地数据存储解决方案。

它允许应用程序在设备的内部存储空间中创建、读取、更新和删除数据,即使在设备重启或应用程序关闭后,这些数据也能得以保留。

相比于传统的文件存储方式,PersistentStorage具有以下优势:1. 简化数据管理:PersistentStorage提供了一套统一的数据访问接口,开发者无需关心底层的文件系统细节,可以更专注于业务逻辑的实现。

2. 数据安全:PersistentStorage对存储的数据进行了加密处理,增强了数据的安全性。

3. 性能优化:PersistentStorage采用了高效的存储算法和数据结构,提高了数据的读写速度。

二、初始化PersistentStorage在使用PersistentStorage之前,首先需要进行初始化操作。

以下是在HarmonyOS中初始化PersistentStorage的基本步骤:1. 创建PersistentStorage实例:通过调用PersistentStorage类的getInstance方法,可以获取PersistentStorage的单例对象。

javaPersistentStorage storage = PersistentStorage.getInstance();2. 设置数据目录:PersistentStorage默认的数据存储路径为"/data/data/<package_name>/files"。

getexternalcachedir()方法

getexternalcachedir()方法

getexternalcachedir()方法在Android开发中,我们经常需要处理外部存储空间,尤其是在使用像Google Maps这样的第三方库时。

在这种情况下,我们通常需要访问设备的外部存储空间,以便将应用程序的数据存储在那里。

`getExternalCacheDir()`是Android API中的一个方法,它返回一个File对象,该对象代表应用程序在外部存储缓存区中的目录。

一、概述`getExternalCacheDir()`方法返回一个File对象,该对象表示应用程序在外部存储上的缓存目录。

这个目录是Android系统为应用程序专门预留的,它允许应用程序在设备上存储大量的临时数据,而这些数据不会影响到设备的可用空间。

这对于那些需要大量缓存数据的应用程序来说是非常有用的,例如地图应用或浏览器应用。

二、使用方法要使用`getExternalCacheDir()`方法,首先需要确保你的Android应用程序有访问外部存储的权限。

你可以在你的AndroidManifest.xml文件中添加以下代码来请求这个权限:```xml<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/> ```然后,在你的代码中,你可以使用以下代码来获取缓存目录:```javaFile cacheDir = getExternalCacheDir(context);```在这里,`context`是一个Context对象,通常可以从Activity 或Application中获取。

三、注意事项在使用`getExternalCacheDir()`方法时,有几个注意事项需要牢记:1. 缓存目录的位置取决于设备的存储配置。

在大多数设备上,它位于设备的外部存储上(例如microSD卡),但并非所有设备都有microSD卡。

第8章RMS(1)

第8章RMS(1)

记录存储的基本操作
数 据 持 久 存 储
记录存储的管理 打开、关闭、删除记录存储
记录的基本操作
记录的增加、读取、删除和修改操作
RecordStore的管理
数 据 持 久 存 储
RecordStore类没有可用的构造函数。该类的对象 可以由一个静态函数来创建。 (1)在当前MIDlet套件中打开(或新建)一个记录 存储。 public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException
MIDP 2.0规范中,只要记录存储允许,其 他套件中的MIDlet可以通过记录存储名和 记录存储所属套件的相关属性访问它。
记录存储的管理
RMS 相应的支持包为:javax.microedition.rms
数 据 持 久 存 储
4 个 RecordComparator 接 口 RecordEnumeration

参数1用来指定要打开的记录存储的名称; 参数2为MIDlet套件的厂商名; 参数3为MIDlet套件的名称。
注意:当记录存储被非当前MIDlet套件中的程序打开时, 该记录存储建立时的模式必须是 RecordStore.AUTHMODE_ANY;而不管在什么模式下, 该记录存储总能被它所在的MIDlet套件中的程序所使用
本章学习内容
数 据 持 久 存 储
RMS的简介 记录存储的管理
RMS的基本操作(记录的增删改查)

J2ME手机程序连接服务器2

J2ME手机程序连接服务器2

J2ME手机程序连接服务器——实现上传数据与返回数据实现的具体功能:手机页面具有闪屏功能,连接服务器后可以上传数据,并返回数据,返回的数据在手机里以列表的形式展现出来(列表的数据实现了分页功能),点击列表里的具体列,弹出详细列表,在此可以查看详细信息相对应的图片(图片来源于服务器端下载时有进度条显示图片下载的进度)。

以下是具体实现的代码:首先介绍一下在MyEclipse里创建手机程序与运行效果如下:第一个手机程序hello world通过MyEclipse 创建手机程序1.建立项目2.在项目里建立类3.运行手机程序运行程序后出现的效果如下:4.手机程序类及其其中的代码.public class Cheshi extends MIDlet {public Cheshi() {// TODO Auto-generated constructor stub }protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub}}5.在手机屏幕上显示hello world一个MIDlet通常由若干个屏幕组成,每个屏幕包含若干个组件元素.程序的运行依赖于屏幕之间的调节和切换,而Display起调节和管理的重要角色。

public class Cheshi extends MIDlet {private Display display;public Cheshi() {// TODO Auto-generated constructor stubdisplay=Display.getDisplay(this);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub}}Display可以在MIDlet中调节不同屏幕,使其中一个成为当前屏幕显示出来就需要Displayable对象的参数.Displayable包含多个多个子类,以下以TextBox为例public class Cheshi extends MIDlet {private Display display;private TextBox t;public Cheshi() {// TODO Auto-generated constructor stubdisplay=Display.getDisplay(this);t=new TextBox("第一个手机程序标题","helloworld",30,TextField.ANY);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stubdisplay.setCurrent(t);}}运行程序的结果为:以上是一个简单的新建手机项目的建立与运行下面我们将建立一个具有客户端与服务器端等一系列功能的程序代码:手机客户端:Public class hhhaaa extends MIDlet implements CommandListener,Runnable {Form form,formmx,xxxx,formtp;TextField txbh,txxm,txxb,txmz,fcx;DateField txcsny;Command qd,tc,txtc,tp,fh,fhtp,qx;List lista,listmx;Display dis;Alert alt1;Image imag,image;String scabcl,bz,bza,ural;String cxbh;int leng,a;Mcan can;这段程序主要是下载图片的:1.下载图片我们考虑到了进度条,我们用了Canvas类中的paint()来绘制进度条public class Xiazai extends MIDlet implements CommandListener,Runnable{Display dis;int leng,a;List listmx;Mcan can;Alert alt1;Command qx,fh,tp,qdcx;TextField cxtj;Form formtp,xxxx,formcx;String bz,bza;String str;String ural,cxbh;Image image;class Mcan extends Canvas implements Runnable {Thread t;boolean isFinished=false;public void run(){while(!isFinished)try{repaint();}catch(Exception exception) { }}public Mcan(){t = new Thread(this);}protected void paint(Graphics g) {byte byte0 = 20;int i = getHeight() / 2 - 2;int j = getWidth() - 40;byte byte1 = 8;g.setColor(0xffffff);g.fillRect(0, 0, getHeight(), getHeight());g.setColor(0);g.drawString("下载中......", byte0, i - 20, 20);g.drawRect(byte0, i, j, byte1);g.setColor(255);if(leng==0){}else{g.fillRect(byte0, i, (a * j) / leng, byte1);}}}public void hhhaaa(){form=new Form("演示");txbh=new TextField("编号:", null, 10, 0);txxm=new TextField("姓名:", null, 10, 0);txxb=new TextField("性别:", null, 10, 0);txmz=new TextField("民族:", null, 10, 0);txcsny=new DateField("出生年月:",DateField.DATE,TimeZone.getTimeZone("cst"));form.append(txbh);form.append(txxm);form.append(txxb);form.append(txmz);form.append(txcsny);form.setCommandListener(this);qd=new Command("确定",Command.SCREEN , 1);tc=new Command("退出",Command.SCREEN , 1);form.addCommand(qd);form.addCommand(tc);form.setCommandListener(this);lista=new List("请选择相应操作", List.IMPLICIT);lista.append("1 录入信息", null);lista.append("2 查询信息", null);lista.append("3 其他", null);lista.setCommandListener(this);}protected void startApp() throws MIDletStateChangeException {Alert alt=new Alert("闪图");imag=alt.getImage();try {alt.setImage(imag.createImage("/001.jpg"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}dis=Display.getDisplay(this);dis.setCurrent(alt,lista);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}public void commandAction(Command arg0, Displayable arg1) {if(arg1.equals(listmx)){if(com==List.SELECT_COMMAND){int zz=listmx.getSelectedIndex();String kk=listmx.getString(zz);String[] ss=getStrArray(kk,"/");cxbh=ss[0];str=ss[0].toString().trim();str="bz=mx"+"&xm="+str;bz="nopic";bza="mx";sevletsc();}}if(arg0==qx){dis.setCurrent(listmx);}if(arg1.equals(lista)){if(arg0==List.SELECT_COMMAND){int aa=lista.getSelectedIndex();switch (aa) {case 0:dis.setCurrent(form);break;case 1:dis.setCurrent(formmx);break;}}}if(arg0==tp){bz="pic";a=0;dis.setCurrent(can);sevletsc();Thread km=new Thread(can);km.start();}if(arg0==txtc){if(fcx.getString().trim().equals("")){alt1.setString("查询条件不能为空");dis.setCurrent(alt1,dis.getCurrent());}scabcl=fcx.getString().trim();System.out.println(scabcl);scabcl="bz=cx"+"&xm="+scabcl;bz="nopic";bza="cx";sevletsc();}if(arg0==fh){dis.setCurrent(lista);}if(arg0==qd){alt1=new Alert("");if(txbh.getString().trim().equals("")){alt1.setString("编号不能为空");dis.setCurrent(alt1,dis.getCurrent());return;}String sca,scb,scc,scd,sce;sca=txbh.getString().trim();scb=txxm.getString().trim();scc=txxb.getString().trim();scd=txmz.getString().trim();sce=txcsny.getDate().toString().trim();scabcl="bz=lr"+"&bh="+sca+"&xm="+scb+"&xb="+scc+"&mz="+s cd+"&csny="+sce;bz="nopic";bza="lr";sevletsc();}以下为分页:if (arg0== cx) {new Thread(this).start();dis.setCurrent(cxmxpm);查询按钮,此按钮是图3-1中的查询按钮图表1-1点击查询按钮弹出第一页list(如图4-1)并且有下一页,上一页,首页,末页,跳转等功能菜单图表2-11.下一页if(arg0== cxxy){if(!String.valueOf(ys).trim().equals(zys.trim())){cxmxpm.deleteAll();ys=ys+1;new Thread(this).start();dis.setCurrent(cxmxpm);}else{alert=new Alert("本页为末页!");dis.setCurrent(alert,cxmxpm);}}2.上一页if(arg0== cxsy){if(ys!=1){cxmxpm.deleteAll();ys=ys-1;new Thread(this).start();dis.setCurrent(cxmxpm);}else{alert=new Alert("本页为首页!");dis.setCurrent(alert,cxmxpm);}}3.首页if(arg0== cxshouy){cxmxpm.deleteAll();ys=1;new Thread(this).start();dis.setCurrent(cxmxpm);}4.末页if(arg0== cxmoy){cxmxpm.deleteAll();ys=Integer.valueOf(zys).intValue();new Thread(this).start();dis.setCurrent(cxmxpm);}5.跳转当点击跳转按钮时,将出现新的FORM屏幕如图5-1图表3-1其中有两个按钮分别是查询和返回(1)查询if(cmd == tzcx){if(Integer.valueOf(tztx.getString()).intValue()>Integer.valueOf(z ys).intValue()&&Integer.valueOf(tztx.getString()).intValue()<0) {alert=new Alert("页数不存在");dis.setCurrent(alert,cxmxpm);}else{ys=Integer.valueOf(tztx.getString()).intValue();System.out.println(ys);cxmxpm.deleteAll();new Thread(this).start();dis.setCurrent(cxmxpm);}(2)返回if(cmd == tzfh){dis.setCurrent(cxmxpm);}分页结束}public void run(){HttpConnection htc=null;DataInputStream dain=null;DataOutputStream dos=null;InputStream input;StringBuffer stb=new StringBuffer();if (bz.equals("nopic")){ural="http://localhost:8080/ww/sj";}else{ural="http://localhost:8080/ww/"+cxbh+".jpg";}try {htc=(HttpConnection)Connector.open(ural);if (bz.equals("nopic")){htc.setRequestMethod("POST");htc.setRequestProperty("Content-Language", "en-US" );byte[] bytesa=str.getBytes();htc.setRequestProperty("Content-Type","application/x-www-forurlencoded"); htc.setRequestProperty("ContentLength",Integer.toString(bytesa!=null?bytesa.length : 0 ) );dos=htc.openDataOutputStream();dos.write(bytesa);}if (bz.equals("nopic")){dain = htc.openDataInputStream();stb.append(dain.readUTF());String ssaa = stb.toString();System.out.println("传回结果:"+stb);jgcl(bza,ssaa);}else{input=htc.openInputStream();leng=(int) htc.getLength();ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();int i;while((i = input.read()) != -1 ){bytearrayoutputstream.write(i);a++;}byte abyte1[] = bytearrayoutputstream.toByteArray();bytearrayoutputstream.close();image= Image.createImage(abyte1, 0, abyte1.length);ImageItem imac=new ImageItem("测试图像",image,YOUT_CENTER,"图片无法显示");formtp.deleteAll();formtp.append(imac);dis.setCurrent(formtp);}} catch (IOException e) {e.printStackTrace();alt1.setString("遇到错误!请检查服务器或本机网络");dis.setCurrent(alt1, dis.getCurrent());}}private void sevletsc(){Thread ty=new Thread(this);ty.start();}private String[] getStrArray(String s, String s1){String as[] = null;int coun=0;String s2=s;int i=0,i1=0,i2=0;while((i = s.indexOf(s1)) != -1){s = s.substring(i + 1, s.length());coun++;}if(coun>0){as = new String[coun];int cas=0;while((i1 = s2.indexOf(s1)) != -1){as[cas]=s2.substring(i2,i1);s2 = s2.substring(i1 + 1, s2.length());cas++;}}return as;}private void jgcl(String bza2, String jieshou2){if(bza2=="cx"){// listmx.deleteAll();String[] aa=getStrArray(jieshou2, "*");if(aa!=null){for(int i=0;i<aa.length;i++){listmx.append(aa[i], null);}listmx.setCommandListener(this);}dis.setCurrent(listmx);}if(bza2=="mx"){xxxx.deleteAll();String[] aa=getStrArray(jieshou2, "*");if(aa!=null){for(int i=0;i<aa.length;i++){xxxx.append(aa[i]+"\n");}xxxx.setCommandListener(this);}dis.setCurrent(xxxx);}}手机客户端结束服务器端:public class Mysever extends HttpServlet {Connection con;Statement sta;ResultSet re;String hm,xm,xb,mz,csny;DataOutputStream dos;String ss="";CachedRowSetImpl crs;String kk="";public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{dos = new DataOutputStream(newBufferedOutputStream(response.getOutputStream()));String kk="";request.setCharacterEncoding("GB2312"); 设置接受数据的编码方式Integer ys=Integer.valueOf ((request.getParameter("ys")+"").trim()); 如图2-1 list 的标题第2/6页,2就是页数 ,也就是 变量ysString bz=(request.getParameter("bz")).trim();if (bz.equals("lr")){String bh=(request.getParameter("bh")).trim();String xm=(request.getParameter("xm")).trim();String xb=(request.getParameter("xb")).trim();String mz=(request.getParameter("mz")).trim(); String csny=(request.getParameter("csny")).trim(); try {String sql="insert into sj (bh,xm,xb,mz,csny) values('"+bh.trim()+"','"+xm.trim()+"','"+xb.trim()+"','"+mz.trim()+"','"+c sny.trim()+"')";sta .execute(sql);kk="增加成功";dos .writeUTF(kk);} catch (SQLException e) {kk="增加失败";dos .writeUTF(kk);e.printStackTrace();}dos .flush();dos .close();} Integer zys=0;if (bz.equals("cx")){crs =new CachedRowSetImpl();try {String sql="select * from sj ";re =sta .executeQuery(sql);crs .populate(re ); 取的页面的值循环取出数据// int ih=crs.getRow();if(st()&&!crs.isAfterLast()){int j=5;if(crs.getRow()%j!=0){zys=crs.getRow()/j+1;}else{zys=crs.getRow()/j;}crs.beforeFirst();}else{kk=null;}int i=0;crs.absolute(ys*5+1);kk="";while(crs.next()&&i<5){kk=kk+crs.getString(1).trim()+"/"+crs.getString(2).trim()+"*";i++;}strReturn=zys+"*"+strReturn;} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}dos .writeUTF(kk);dos .flush();dos .close();}if (bz.equals("mx")){String xm=(request.getParameter("xm")).trim();System.out .println(xm);String ss="select * from sj where bh='"+xm+"'"; try {re =sta .executeQuery(ss);while (re .next()){int p=1;ResultSetMetaData rr=re .getMetaData();int y=rr.getColumnCount();while (p<=y){kk+=re .getString(p).trim()+"*";p++;}}catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} dos .writeUTF(kk);dos .flush();dos .close()}{ 判断标志是否数据明细 通过编号查询数据Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");String url ="jdbc:sqlserver://localhost:1433;DatabaseName=websj";String user = "sa";String pas = "";try {con = DriverManager.getConnection(url, user, pas);sta = con.createStatement();}}}服务器端结束以下是分页以及查询的大致思想:分页:手机分页思路:手机由于流量限制,速度限制,屏幕大小限制,导致无法将所有数据全部下载到手机,所以我要实现以下功能1.在服务器端查询出要查询的信息,并计算页数,以及通过手机上传信息来确定返回的记录条数,形成字符串返回.2.手机端要实现(1)上一页 (2)下一页 (3)首页 (4)末页(5)跳转等功能(如图1-1)图表4-13.各种细节,如需要在list 的表头上显示第几页,总几页等如图(1-1)查询:J2ME手机查询的实现与理解手机查询实现的是手机端与服务端的联接,由服务端返回所查信息的过程,其中包括了:文字、图片甚至视频的返回,这里仅是讲讲文字信息的返回。

J2me存储和连接详解

J2me存储和连接详解

2
字节数组
间主要交互的各个组件。
3
字节数组
J2ME 101,第 2 部分:介绍 MIDP 的低层 UI (2003 年 12 月)介
绍 创 建 和 使 用 Canvas 和
Graphics 类的基础知识,并概述
...
...
了 MIDP 2.0 中 引 入 的 Game
惟一行标识是一个整型值。第一个条目的 ID 为 1,然 API。
作为 J2ME 101 教程系列的补充系列两篇文章中的第一篇,本文将向您介绍 MIDP 持久存
储系统的内部工作原理。我们将从 RMS 的概览开始,不过大部分内容(如同教程系列一样)
更倾向于实际应用。并且,我们将会构建一些 MIDlet,帮助您了解如何从 RMS 中读取和
写入数据记录,并了解这个功能非常全面而紧凑的数据管理系统的各种排序、搜索和检索选
boolean createIfNecessary) RecordStore openRecordStore(String recordStoreName,
boolean createIfNecessary, int authmode, boolean writable) RecordStore openRecordStore(String recordStoreName, String vendorName, String suiteName)
项。
注意,本文假设您熟悉 J2ME 环境中的 MIDlet 开发。为了编译代码示例,系统上需要安装
J2ME 开发环境。请参阅 参考资料部分,其中有 J2ME Wireless Toolkit(WTK)安装指南的
超链接。
MIDP 中的记录管理
简单地说,MIDP 记录管理系统(RMS)提供了一种跨多个 MIDlet 调用持久性地存储应用

Android4.4访问外部存储详解及实例

Android4.4访问外部存储详解及实例

Android4.4访问外部存储详解及实例Android4.4 访问外部存储在Android 4.4系统中,外置存储卡(SD卡)被称为⼆级外部存储设备(secondary storage),应⽤程序已⽆法往外置存储卡(SD卡)写⼊数据,并且WRITE_EXTERNAL_STORAGE只为设备上的主要外部存储(primary storage)授予写权限,对于其他外部存储,其上的⽂件属性都改为基于⽂件夹结构,应⽤⽆需获取WRITE_EXTERNAL_STORAGE权限,但可以管理与⾃⼰包名相关的⽂件夹。

举例来说,如果应⽤的包名是com.example.externalstorage,那么外部存储上的Android/data/com.example.externalstorage/⽂件夹就是它的了,可随意访问,⽆需权限。

另外需要特别注意的是,应⽤卸载的时候,在SD卡上创建的相应⽂件夹、数据都会被同时完全删除。

例外,在Android 4.4⾥,系统应⽤(指有platform签名,或预装在/system/priv-app⽬录下的应⽤)可以通过使⽤WRITE_MEDIA_STORAGE权限获取完全读写SD卡的权限。

Android 4.4增加了下⾯的函数访问外部存储:Context.getExternalFilesDirs(null), 返回多个sd卡的该应⽤私有数据区的files⽬录/storage/sdcard0/Android/data/<包名>/files/storage/sdcard1/Android/data/<包名>/filesContext.getExternalCacheDirs(), 返回多个sd卡下该应⽤私有数据库的缓存⽬录/storage/sdcard0/Android/data/<包名>/caches/storage/sdcard1/Android/data/<包名>/cachesContext.getObbDirs(), 返回多个sd卡下obb⽬录下的私有数据(该⽬录⼀般是游戏的数据包⽬录)/storage/sdcard0/Android/obb/<包名>/storage/sdcard1/Android/obb/<包名>通过上⾯的函数在我的Android 5.1的系统上可以正确获取sd卡路径,但是在Android4.4系统上只能看到内部存储的路径。

Android编程基础预2章-J2ME开发环境的安装及配置

Android编程基础预2章-J2ME开发环境的安装及配置

2.4 Eclipse下开发环境的搭建
Eclipse是一个非常著名的集成开发工 具,其自身功能强大而易用。
Eclipse的另一个非常重要的特点是其 提供了非常灵活的扩展能力。
2.1 安装JDK
JDK是Java开发工具包(Java Development Kit)的英文缩写。它是一种 用于构建在Java平台上发布的应用程序、 Applet和组件的开发环境。
JDK是一切Java应用程序的基础,所 有的Java应用程序是构建在这个之上的。 它是一组API,也可以说是一些Java Class。
使用WTK搭建J2ME的开发环境,必 须首先安装标准的Java开发环境JDK,如 jdk1.4.2。
目前Sun公司提供的WTK版本有WTK 1.04、WTK 2.0、WTK 2.1和WTK 2.2,开 发人员通常可以根据自己的目标选择安装 其中之一。
其中WTK 1.04用于MIDP 1.0的开发, 而WTK 2.0则用于MIDP 2.0的开发,而 WTK 2.1和WTK 2.2则同时包含了对MIDP 1.0和MIDP 2.0支持。
图2-3 设置环境变量
图2-4 新建环境变量
图2-5 设置环境变量
图2-6 编辑环境变量
2.3 安装Sun WTK
Sun公司为了J2ME而提供了WTK开 发工具,是最基本的J2ME程序开发工具, 它是免费提供的,体积小,执行速度较快, 完全遵守J2ME的各种规范,因此是J2ME 程序员最基础的必备的工具。
5 简单开发周期
简单开发周期类似于: 编辑源代码 -> 生成 -> 运行
编辑源代码。在此步骤中,创建您的 应用程序将使用的 Java 源文件和资源 文件。 生成。J2ME Wireless Toolkit 对您的 Java 源文件进行编译和预校验。 运行。在仿真器上运行已编译的 Java 类文件。

用手机入门J2ME

用手机入门J2ME

[J2ME预备知识]我会的东西也不多。

但我会把我会的东西教给你。

如果有说的不好的地方,也请高手指出,不吝赐教。

万分感谢。

J2ME,一般的书上都会有一大堆的名词,比如1995年sun公司创建的java语言的三大分支之一,适用于嵌入式设备,J2ME配置分为CDC和CLDC,CLDC上层的重要简表是MIDP 等等。

其实我们这里学习的J2ME简单的来说,就是手机jar软件。

比如QQ,UC浏览器,Classtraslator,Classeditor,minicommander等等。

不过对于UC和QQ这种大型软件,是公司开发的。

个人开发周期太长了。

通常我们改软,就是在别人制作好的软件的基础上修改。

(改软最高技术个人觉得是,电脑端是halo,手机端是jamsin,Disjamsin的字节码,学习JVM代码)而J2ME就是制作软件。

在新手阶段,CLDC,MIDP,Java历史,发展等等我们都不用了解太多。

我们可以从简单的源码开始学习。

J2ME的学习不象一般的改软,几天之内就能学会一种改软方法。

J2ME的学习,通常以月为单位。

一,两个月才会有成效。

同时学习J2ME也很苦。

不象大家想的那样,挥手就可以做出一个软件。

很多时候调试一个软件的一个很小的bug都得花上很长的时间。

J2ME大部分时间不是在开发软件,而是在调试软件。

也只有在调试时,发现错误,才能提高我们。

所以是否学习J2ME希望大家慎重的考虑。

如果兴趣不是很大,或者不能坚持下去,建议不要学。

因为花了大量的时间,结果只会一点,半途而废,还不如不学。

其实不会有时也是一种幸福。

还有,总是听别人说,我英语不好,不适合学习J2ME。

我可以很明确的告诉大家,在新手阶段,以及编程爱好者阶段,J2ME的开发和英语一点关系都没有。

到是和数学的逻辑思维有关系。

当然,如果后期想做个合格的程序开发员,英语还是得补的。

毕竟“出来混,迟早都要还”。

当然,后期的英语,以及基础的知识由大家自己补,这系列教程都是入门教程,只是带大家入门的。

浅谈J2ME内存占用及优化方法

浅谈J2ME内存占用及优化方法

新的 对象会把 旧的对象冲掉并且释放内存。 这里面包含两个问题 ( )该段代码是先 创 1. 建对象然后再进行赋值操作的 ,也就是说 在这期间有两个对象同时存在 ,这就很 可 能会产生溢 出。2 . ( )这样做也会妨碍垃圾 回
收器的工作。 较好 的 写法 如 下 :
a ul -n l ;
维普资讯
浅谈 J 存 E 2 M
二 、内存 优 化
内存优化 可以 归结 为以下 几种方法 。 代码优化 ,图片优化 ,第 三方工具优化。
21 . 代码 优 化
占用及优化 方法
宫兵 大连职工 大学 l6 2 10 1
占用量 ,在载入一张很大的 图片后它的 内
退 到 主 菜 单 逻辑 ,对 游 戏 逻 辑 对 象 的 态 度 很多开发者会选择等待垃圾 回收器来 自动
存线在 只出现 了微微的波动后又停 留在原 位。在平时的开发过程当中使用 7 1 模拟 20 器 自带的 内存 监视 器 ,模 拟的 准确 率较 高 ,但唯 一的缺 点是 内存太 少,只有可怜 20 0 K。在 使用 3 2 2 0的模拟器监视 内存 , 内存 会稍 微扩 大 。 Ru tme类方 法 : ni 在开 发过程 当中,我们 会经 常用这 个
语 句
S s e . u . r n l ( ntme. y t m o t p i t n Ru i
者 经验,就 J M 2 E内存优化 问题进 行详蛔 的阐
述。
回收。 乍看之下似乎并 无不妥 , 垃圾回收器 会来善后 。实际上垃圾 回收器并非实时的, 它 不 像 C +的 D lt语 句 马 上释 放 不 用的 + e e e 内存。当从游戏逻辑切换到主菜单逻辑 , 这 时两个对象 同时存在 ,很可能这时 内存就 不够 用了。读 到这 里很 多人会发现 实际上 垃圾 回收器在 jme 2 上并不是特别好用 ,从 个 角度上来讲在 jme上除简单 类型以外 2 很 多 垃 圾 必 须 由 手 工 释 放 , 例 如

1.什么是2ME

1.什么是2ME

1.什么是J2MEJ2ME 实际上是一系列规范的集合,由JCP 组织制定相关的Java Specification Request (JSR)并发布,各个厂商会按照规范在自己的产品上进行实现,但是必须要通过TCK 测试,这样确保兼容性。

比如MIDP2.0 规范就是在JSR118 中制定的.2.J2ME体系J2ME 平台是由配置(Configuration)和简表(Profile)构成的。

配置是提供给最大范围设备使用的最小类库集合,在配置中同时包含Java 虚拟机。

简表是针对一系列设备提供的开发包集合.J2ME 中有两个最主要的配置,分别是Connected Limited Devices Configuration(CLDC 有限连接设备配置)和Connected Devices Configuration(CDC 连接设备配置)3.MIDlet 应用程序的生命周期通常是通过方法notifyDestroyed()和notifyPaused()实现的MIDlet 有三个状态,分别是pause、active 和destroyed。

4.CLDC(Connected Limited Device Configuration 有限连接设备配置)CLDC是J2ME核心配置中的一个,可以支持一个或多个profile。

其目标主要面向小型的、网络连接速度慢、能源有限(主要是电池供电)且资源有限的设备,如手机、机顶盒、PDA 等。

CLDC 的核心是虚拟机和核心类库。

虚拟机运行在目标操作系统之上,对下层的硬件提供必要的兼容和支持;核心类库提供操作系统所需的最小的软件需求。

CLDC 的目标1) 为小型的、资源受限的连接设备定义一个Java 平台标准2) 允许向上述设备动态的传递Java 应用和内容3) 使Java 开发人员能够轻松的在这些设备上进行应用开发CLDC 的整体需求1) 能运行在绝大多数的小型的、资源受限的连接设备上2) 用CLDC 为上述设备开发的应用尽可能的不使用设备的本地系统软件(做到与平台、设备无关)3) 定义能应用在绝大多数上述设备上的最小子集的规范4) 保证在不同类型上述设备之间代码级的可移植性和互操作性CLDC 的硬件需求1) 至少160KB 的固定内存以供虚拟机和CLDC 核心类库使用。

J2ME开发环境的安装及配置

J2ME开发环境的安装及配置

J2ME开发环境的安装及配置J2ME(Java 2 Platform, Micro Edition)是一种用于开发移动设备应用程序的Java平台。

它提供了一个底层的Java运行时环境,适用于资源有限的设备,如手机、PDA和其他嵌入式系统。

本文将介绍如何安装和配置J2ME开发环境。

第一步:下载J2ME开发工具包(SDK)首先,您需要下载J2ME开发工具包(也称为SDK)。

可以从Oracle官网或其他第三方网站下载最新版本的J2ME SDK。

确保选择与您正在使用的操作系统相对应的版本。

第二步:安装J2ME SDK下载完成后,运行安装程序并按照提示进行安装。

通常,安装程序将要求您选择安装目录和其他一些选项。

确保选择一个合适的安装目录,以便稍后在配置环境时使用。

第三步:设置环境变量安装完成后,需要设置一些环境变量,以便系统能够正确识别和运行J2ME开发工具包。

根据您使用的操作系统,以下是一些常见的环境变量设置方法:在Windows上:1. 打开“控制面板”并点击“系统”。

2. 点击“高级系统设置”。

3. 在“系统属性”窗口中,点击“环境变量”按钮。

4. 在“系统变量”区域中,找到“Path”变量并点击“编辑”按钮。

5. 在变量值的末尾添加J2ME安装目录的路径,以分号分隔。

例如:C:\j2me_sdk\bin;(假设J2ME SDK安装在C:\j2me_sdk目录下)在Linux上:1. 打开终端。

2. 输入以下命令:export PATH=$PATH:/path/to/j2me_sdk/bin(将“/path/to/j2me_sdk”替换为您的J2ME SDK的实际安装路径)第四步:配置开发环境安装和配置开发环境的下一步是选择一个集成开发环境(IDE)来编写和调试J2ME应用程序。

下面是一些流行的J2ME开发工具:1. Eclipse:Eclipse是一款常用的Java开发IDE,可以通过安装插件来支持J2ME开发。

persistconfig的参数

persistconfig的参数

persistconfig的参数persistconfig是Kubernetes 中的一个参数,用于配置持久化存储卷的配置。

当你在Kubernetes 中使用持久化存储卷(Persistent Volume)和持久化存储卷申请(Persistent Volume Claim)时,persistconfig参数允许你指定持久化存储卷的配置信息。

persistconfig参数通常与持久化存储卷的配置文件一起使用,该文件定义了持久化存储卷的属性和配置。

以下是一些常见的persistconfig参数:1.type:指定持久化存储卷的类型,例如gcePersistentDisk, awsElasticBlockStore, nfs等。

2.accessMode:指定持久化存储卷的访问模式,例如ReadWriteOnce或ReadOnlyMany。

3.size:指定持久化存储卷的大小。

4.fsType:指定文件系统类型,例如ext4, xfs等。

5.iopsPerGB:对于一些类型的持久化存储卷,如AWS 的EBS,可以指定每GB 的IOPS 值。

6.volumeBindingMode:指定如何绑定持久化存储卷到节点上。

可以是Immediate或WaitForFirstConsumer。

7.storageClass:指定用于持久化存储卷的存储类名称。

8.selector:一个标签选择器,用于选择哪些节点可以访问该持久化存储卷。

9.reclaimPolicy:定义当持久化存储卷不再被使用时,是否应该被自动回收。

10.volumeMode:指定持久化存储卷的模式,可以是Filesystem或Block。

这些参数可以通过一个配置文件进行设置,然后将配置文件与持久化存储卷一起提交到Kubernetes 集群中。

通过使用persistconfig参数,你可以更好地控制和管理持久化存储卷的行为和配置,以满足特定的存储需求和性能要求。

j2me记录存储管理系统RMS

j2me记录存储管理系统RMS
"+rs.getNumRecords());
}catch(Exception e){ e.printStackTrace();
} }
}
将对象写入 RMS Midlet4ObjInRMS
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.rms.RecordStore;
} } }
删除记录集
Midlet3delete
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordStore;
public Midlet2addup() { }
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

String brand = "Honda"; byte bytes[] = brand.getBytes(); int recID = rs.addRecord(bytes,0,bytes.length);
J2ME Persistent Storage
9
Retrieving Records
There are two versions to retrieve a record:
J2ME Persistent Storage
2
Records
RMS is a system for managing records. A record is an individual data item. No data type. A record is represented by an array of bytes. A record can contain a number, a string, an array, an image -- anything that a sequence of bytes can represent. Manipulating byte array is difficult. A simple way is to use String as it has a rich API to manipulate and convert it to and from byte array is simple.
J2ME Persistent Storage
8
Adding Records
The MIDlet invokes the addRecord() method of RecordStore class to insert a new record into the record store.
– public int addRecord(byte[] data, int offset, int numBytes) inserts a record represented by an array of bytes data with offset as its starting index and numBytes as its length.
J2ME Persistent Storage
3
Where are the fields?
Don't be confused by the term record. The answer is simple: – In RMS a record doesn't have any fields. A record consists of an array of single binary field of variable size identified by a record Id. This keeps RMS small and flexible -- important attributes for a MIDP subsystem. The programmer has to handle type conversion, comparison, etc.
J2ME Persistent Storage
4
Record Stores
A record store is an ordered collection of records. Each record must belong to a record store, and all record access occurs through the record store. In fact, the record store guarantees that records are read and written atomically, with no possibility of data corruption.
String brand = "Toyota"; byte data[] = newappt.getBytes(); rs.setRecord(recID, data, 0, data.length());
J2ME Persistent Storage
11
Deleting Records
The MIDlet invokes the deleteRecord() method to delete a record from the record store. public void deleteRecord(int recordId) – deletes the record represented by recordId. The recordId is not reused.
byte[] retrieved = new byte[rs.getRecordSize(recID)]; rs.getRecord(id, retrieved, 0); String retrievedString = new String(retrieved); byte[] retrieved = rs.getRecord(recID); String retrievedString = new String(retrieved);
public int getRecord(int recordId, byte[] buffer, int offset) – copies the data stored in the given record to the byte array represented by buffer. public byte[] getRecord(int recordId) – returns a new copy of the data represented by recordId.
J2ME Persistent Storage
5
Record Stores
When a record is created, the record store assigns it a unique identifier, an integer called the record ID.
The first record added to a record store has a record ID of 1, the second a record ID of 2, and so on.
J2ME Persistent Storage
6
Managing Record Stores
To open aຫໍສະໝຸດ record store, you simply need to call the openRecordStore method.
– public static RecordStore openRecordStore( String recordStoreName, boolean createIfNecessary) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException
– sets new information, a stream of bytes (newData) with offset as its starting index and numBytes as its length, at the record location represented by recordId.
J2ME Persistent Storage
13
Example - Simple Password Records
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; public class SimpleDBDemo extends MIDlet implements CommandListener { private Display display; private Form fmMain; private Command cmExit, cmAdd, cmUpdate, cmDelete, cmRetrieve; private TextField tfRecID; private TextField tfName; private TextField tfPwd; private RecordStore rs; public SimpleDBDemo() throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException { display = Display.getDisplay(this);
rs.deleteRecord(1);
J2ME Persistent Storage
12
Example - Simple Password Records
A simple program that allows a user to add, update, delete and retrieve records. The user needs to remember the record IDs.
Question: Which method is easier? Which method is faster?
J2ME Persistent Storage
10
Updating Records
To update a record use the method setRecord: public void setRecord(int recordId, byte[] newData, int offset, int numBytes)
相关文档
最新文档