我们知道 j2me 中没有 j2se 里边的 Properties 类,要自己实现才能像 j2se 那样读取文件的,现在 j2mepolish 里边的 de.enough.polish.util.Properties 就实现了类似 j2se 的 Properties, 加上de.enough.polish.util.ResourceStreamUtil(旧版本polish 没有这个类,要自己实现相应功能)可以让我们容易读取属性文件。关于 ResourceStreamUtil 类和 Properties 类的介绍大家可以参考 j2mepolish 里边的 api doc。
只要在把你所新建的 .properties 文件放在 resources 文件夹下(相当于一个资源文件,也可以放其他地方,但一定要把它配置成资源),就可以用相应的方法读取, 看下边例子:
test.properties文件:
name=muscle-liu
sex=male
age=24
读取时的部分代码:
Properties prop = new Properties();
InputStream in = null;
try{
byte[] sData = ResourceStreamUtil.getResourceAsByteArray("/test.properties");
System.out.println("sData.length: "+sData.length);
in = new ByteArrayInputStream(sData);
prop.load(in);
}catch (IOException e){
e.printStackTrace();
}
System.out.println("prop.getProperty(\"name\"): "+prop.getProperty("name"));
System.out.println("prop.getProperty(\"sex\"): "+prop.getProperty("sex"));
System.out.println("prop.getProperty(\"age\"): "+prop.getProperty("age"));
运行结果如下:
prop.getProperty("name"): muscle-liu
prop.getProperty("sex"): male
prop.getProperty("age"): 24
在运用中我发现这个 Properties 类有个 bug,就是不支持 # 的注释(也就是说,属性文件里边除了 key-value 的内容,不能有其他的非 k-v 内容)。下边是我修改 Properties 里边的 load 方法,令它支持 # 注释:
原来的 load 方法:
public void load(InputStream in, String encoding, boolean generateIntegerValues ) throws IOException
{
this.isIntegerValues = generateIntegerValues;
int bufferLength = 2 * 1024;
byte[] buffer = new byte[ bufferLength ];
int read;
int start = 0;
int end = 0;
boolean newLineFound;
while ( (read = in.read(buffer, start, bufferLength - start )) != -1) {
// search for next \r or \n
String line;
if (encoding != null) {
line = new String( buffer, 0, read + start, encoding );
} else {
line = new String( buffer, 0, read + start );
}
start = 0;
newLineFound = true;
while (newLineFound) {
newLineFound = false;
char c = '\n';
for (int i = start; i < line.length(); i++) {
c = line.charAt(i);
if (c == '\r' || c == '\n') {
end = i;
newLineFound = true;
break;
}
}
if (newLineFound) {
int splitPos = line.indexOf('=', start);
if(splitPos == -1) {
throw new IOException("no = separator: " + line.substring( start, end ));
}
String key = line.substring( start, splitPos );
String value = line.substring( splitPos + 1, end );
if (generateIntegerValues) {
try {
put( key, Integer.valueOf(value) );
} catch(NumberFormatException ex) {
throw new IOException( ex.toString() );
}
} else {
put( key, value );
}
if (c == '\r') {
start = end + 2;
} else {
start = end + 1;
}
}
}
// now all key-value pairs have been read, now move any remaining data to the beginning of the buffer:
if (start < read) {
System.arraycopy( buffer, start, buffer, 0, read - start );
start = read - start;
} else {
start = 0;
}
}
}
修改后的 load 方法:
public void load(InputStream in, String encoding, boolean generateIntegerValues ) throws IOException
{
this.isIntegerValues = generateIntegerValues;
int bufferLength = 2 * 1024;
byte[] buffer = new byte[ bufferLength ];
int read;
int start = 0;
int end = 0;
boolean newLineFound;
boolean isComment;
while ( (read = in.read(buffer, start, bufferLength - start )) != -1) {
// search for next \r or \n
String line;
if (encoding != null) {
line = new String( buffer, 0, read + start, encoding );
} else {
line = new String( buffer, 0, read + start );
}
start = 0;
newLineFound = true;
while (newLineFound) {
newLineFound = false;
isComment = false;
char c = '\n';
char firstChar = line.charAt(start);
if(firstChar == '#'){
isComment = true;
}
for (int i = start; i < line.length(); i++) {
c = line.charAt(i);
if (c == '\r' || c == '\n') {
end = i;
newLineFound = true;
break;
}
}
if (newLineFound && !isComment) {
int splitPos = line.indexOf('=', start);
if(splitPos == -1) {
throw new IOException("no = separator: " + line.substring( start, end ));
}
String key = line.substring( start, splitPos );
String value = line.substring( splitPos + 1, end );
if (generateIntegerValues) {
try {
put( key, Integer.valueOf(value) );
} catch(NumberFormatException ex) {
throw new IOException( ex.toString() );
}
} else {
put( key, value );
}
}
if (c == '\r') {
start = end + 2;
} else {
start = end + 1;
}
}
// now all key-value pairs have been read, now move any remaining data to the beginning of the buffer:
if (start < read) {
System.arraycopy( buffer, start, buffer, 0, read - start );
start = read - start;
} else {
start = 0;
}
}
}
这样我们就可以像 j2se 那样写 properties 文件了..当然,如果你的项目中没有用 j2mepolish, 那你也可以借用这两个类到你的工程,照样可以实现 j2se 的 properties 功能
- Properties.rar (3.6 KB)
- 描述: 修改过的 properties 类和 ResourceStreamUtil类
- 下载次数: 186
分享到:
相关推荐
J2ME包含配置和 profiles,这些定义了特定设备集的最小功能集,使得开发者可以编写适应不同设备的代码。例如,Mobile Information Device Profile (MIDP) 和 Connected Limited Device Configuration (CLDC) 是J2ME...
本示例将深入探讨如何在J2ME和J2SE之间建立SOCKET连接,实现数据通信。SOCKET是网络编程中的基本组件,它提供了一种进程间通信(IPC)的方式,使得不同设备可以通过网络交换数据。 首先,我们来看J2ME部分。J2ME...
原因很简单,游戏开发主要是利用 J2SE 技术,而 J2EE、J2ME 都是在 J2SE 的基础上发展起来的,也必须依托 J2SE 而存在,三者是相辅相成的。J2SE 是基础,万丈高楼平地起,只要你的基础打好了,有什么程序不能做呢?...
自己写的简单算法,可用于对字符串的加密解密,可用于网络传输
分析对比J2EE,J2SE,J2ME,比较简单移动,挺不错一个期刊
标题“j2me 实现打电话功能”表明我们将探讨如何利用J2ME技术来实现手机的基本通话功能。描述中提到这个功能已经在真机上经过测试,这意味着我们拥有的是一个实际可行的解决方案。 J2ME由两部分组成:KJava API和...
这是本人从网上收集的J2系列的API文档,包括J2ME,J2SE,J2EE.其中j2se是中文版的,其它两个是英文版的,一共有3个压缩文件,只有一起下放在同一个目录中才能解压。(这是第三卷)
本篇文章将深入探讨如何利用J2ME来实现短信功能,包括客户端和服务器端的实现细节。 首先,我们要理解J2ME中的SMS(Short Message Service)机制。在J2ME中,短信功能主要依赖于MIDP(Mobile Information Device ...
### Java 平台的不同版本:J2SE、J2EE 和 J2ME 的区别 在 Java 开发领域中,根据不同的应用场景和需求,Java 被分为了几个主要的平台版本,分别是 J2SE(Java 2 Standard Edition)、J2EE(Java 2 Enterprise ...
用J2ME实现简单电子邮件发送功能 用J2ME实现简单电子邮件发送功能
它阐释了J2ME的基本体系结构和功能,总结了J2ME与J2SE和J2EE的差异,深入探讨了构建J2ME数据库所需的关键内容,例如,命令、项、事件处理、低层和高层显示接口;介绍了移动开发的高级技术,包括安全、Web服务、住处...
本文向大家简单介绍一下JDK、J2EE、J2SE、J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务,也就是提供不同类型的类库。
不好意思,两个笔记是一样的,是上传的时候没注意,见谅。 分要的非常高,觉得有必要再下. 二年以上Java经验请不要下载. 二年以下应该能从中得到一些东西的,因为是比较全面的. 不管怎么样,觉得有必要才去下,下了又要...
J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码
总的来说,这个J2ME画图程序利用了 `Canvas` 类提供的基本绘图能力,结合 `MIDlet` 的生命周期管理,以及用户输入事件的处理,实现了在移动设备上简单的涂鸦功能。虽然代码片段未给出完整的绘图逻辑,但我们可以推断...
Java 技术体系是 Sun Microsystems(后被Oracle收购)推出的一套用于开发和部署跨平台应用程序的框架,它包括三个主要版本:J2ME(Java 2 Micro Edition)、J2EE(Java 2 Platform, Enterprise Edition)和J2SE...
J2ME提供了开发和部署移动应用程序的框架,使开发者能够在多种不同的设备上实现跨平台的应用程序。 ### J2ME的架构 J2ME的架构主要由两部分组成:配置(Configuration)和框架(Profile)。 1. **配置...
它阐释了J2ME的基本体系结构和功能,总结了J2ME与J2SE和J2EE的差异,深入探讨了构建J2ME数据库所需的关键内容,例如,命令、项、事件处理、低层和高层显示接口;介绍了移动开发的高级技术,包括安全、Web服务、住处...