`
muscle-liu
  • 浏览: 229618 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

j2me 实现 j2se 的 Properties 功能

    博客分类:
  • j2me
阅读更多
我们知道 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
分享到:
评论
3 楼 muscle-liu 2008-07-30  
我们可以继承j2me里边的Hashtable来实现的,而接口Externalizable 是继承Serializable的,所以完全可以改为自己的properties,在其他的j2me项目里都能用
2 楼 jandyguan 2008-07-15  
因为Properties类继承Hashmap,实现接口Externalizable,这些都是Polish的东西,所以在其它项目单用这两个类是不行的。
1 楼 mingkg21 2008-04-14  
复杂了一些,还可以简单一点。。。。。

相关推荐

    J2SE.rar_j2me_j2se

    J2ME包含配置和 profiles,这些定义了特定设备集的最小功能集,使得开发者可以编写适应不同设备的代码。例如,Mobile Information Device Profile (MIDP) 和 Connected Limited Device Configuration (CLDC) 是J2ME...

    最简单J2ME与J2SE的SOCKET链接例子,一看就懂

    本示例将深入探讨如何在J2ME和J2SE之间建立SOCKET连接,实现数据通信。SOCKET是网络编程中的基本组件,它提供了一种进程间通信(IPC)的方式,使得不同设备可以通过网络交换数据。 首先,我们来看J2ME部分。J2ME...

    Java游戏开发StepbyStep系列之一.rar_Java step by step_Java游戏_j2me_j2se_we

    原因很简单,游戏开发主要是利用 J2SE 技术,而 J2EE、J2ME 都是在 J2SE 的基础上发展起来的,也必须依托 J2SE 而存在,三者是相辅相成的。J2SE 是基础,万丈高楼平地起,只要你的基础打好了,有什么程序不能做呢?...

    简单网络加密算法(j2me,j2se经测试都可用)

    自己写的简单算法,可用于对字符串的加密解密,可用于网络传输

    浅析J2EE,J2SE,J2ME

    分析对比J2EE,J2SE,J2ME,比较简单移动,挺不错一个期刊

    j2me 实现打电话功能

    标题“j2me 实现打电话功能”表明我们将探讨如何利用J2ME技术来实现手机的基本通话功能。描述中提到这个功能已经在真机上经过测试,这意味着我们拥有的是一个实际可行的解决方案。 J2ME由两部分组成:KJava API和...

    J2SE J2EE J2ME API 中文版下载

    这是本人从网上收集的J2系列的API文档,包括J2ME,J2SE,J2EE.其中j2se是中文版的,其它两个是英文版的,一共有3个压缩文件,只有一起下放在同一个目录中才能解压。(这是第三卷)

    J2ME实现短信功能

    本篇文章将深入探讨如何利用J2ME来实现短信功能,包括客户端和服务器端的实现细节。 首先,我们要理解J2ME中的SMS(Short Message Service)机制。在J2ME中,短信功能主要依赖于MIDP(Mobile Information Device ...

    j2ee 与 j2se 和 j2me的区别

    ### Java 平台的不同版本:J2SE、J2EE 和 J2ME 的区别 在 Java 开发领域中,根据不同的应用场景和需求,Java 被分为了几个主要的平台版本,分别是 J2SE(Java 2 Standard Edition)、J2EE(Java 2 Enterprise ...

    用J2ME实现简单电子邮件发送功能

    用J2ME实现简单电子邮件发送功能 用J2ME实现简单电子邮件发送功能

    J2ME开发大全pdf(中文+源码)

    它阐释了J2ME的基本体系结构和功能,总结了J2ME与J2SE和J2EE的差异,深入探讨了构建J2ME数据库所需的关键内容,例如,命令、项、事件处理、低层和高层显示接口;介绍了移动开发的高级技术,包括安全、Web服务、住处...

    解析J2EE、J2SE、J2ME、JDK的区别

    本文向大家简单介绍一下JDK、J2EE、J2SE、J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务,也就是提供不同类型的类库。

    Java学习笔记(从j2se到j2ee都有)

    不好意思,两个笔记是一样的,是上传的时候没注意,见谅。 分要的非常高,觉得有必要再下. 二年以上Java经验请不要下载. 二年以下应该能从中得到一些东西的,因为是比较全面的. 不管怎么样,觉得有必要才去下,下了又要...

    J2ME 实现的 UrlEncode编码

    J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码

    J2ME实现画图程序

    总的来说,这个J2ME画图程序利用了 `Canvas` 类提供的基本绘图能力,结合 `MIDlet` 的生命周期管理,以及用户输入事件的处理,实现了在移动设备上简单的涂鸦功能。虽然代码片段未给出完整的绘图逻辑,但我们可以推断...

    J2ME-J2EE-J2SE

    Java 技术体系是 Sun Microsystems(后被Oracle收购)推出的一套用于开发和部署跨平台应用程序的框架,它包括三个主要版本:J2ME(Java 2 Micro Edition)、J2EE(Java 2 Platform, Enterprise Edition)和J2SE...

    J2ME结构体系(新)

    J2ME提供了开发和部署移动应用程序的框架,使开发者能够在多种不同的设备上实现跨平台的应用程序。 ### J2ME的架构 J2ME的架构主要由两部分组成:配置(Configuration)和框架(Profile)。 1. **配置...

    J2ME开发大全(中英文版)

    它阐释了J2ME的基本体系结构和功能,总结了J2ME与J2SE和J2EE的差异,深入探讨了构建J2ME数据库所需的关键内容,例如,命令、项、事件处理、低层和高层显示接口;介绍了移动开发的高级技术,包括安全、Web服务、住处...

Global site tag (gtag.js) - Google Analytics