J2ME中的字符串管理和多语言支持

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

近期学习j2me开发,也谈谈我对字符串管理的一个方案。

字符串管理的目的是字符串的资源化管理。

1。这个系统应该可以通过静态方法访问;

2。字符串保存在资源当中;

3。可以方便的切换各种语言以达到多语言支持;

4。字符串资源有一个名字,通过名字访问该资源;

5。名字的规则应该是类名+内部名称。

下一个问题就是资源以何种格式存储的问题:

按理说XML是理想的方式,但是考虑到j2me系统的特殊性,采用plain text更为合适

格式是string-name string-value

name和value之间以空格或\t分割,不同的字符串之间以\n分隔。

内部采用hashtable存储。

通过以上的分析,可以写出如下的StringManager

package vmLinux.app;

import Java.io.*;

import java.util.*;

public class StringManager {

String lang_;

String name_;

Hashtable strings_;

boolean loaded_;

public StringManager(String lang)

{

lang_=lang;

loaded_=false;

}

public void setLang(String lang)

{

if(lang_==lang)

return;

lang_=lang;

loaded_=false;

}

public void load(String name)

{

if(name==name_ && loaded_)

return;

if(strings_==null)

strings_=new Hashtable();

else

strings_.clear();

InputStream is=this.getClass().getResourceAsStream("/strings/"+name+"."+lang_);

try

{

byte[] buf=new byte[1024];

int c=is.read(buf);

StringBuffer o=new StringBuffer();

String key=null;

do{

String data=new String(buf,0,c);

int s=0;

for(int i=0;i<data.length();++i)

{

char x=data.charAt(i);

if(s==0 && (x==' ' x=='\t'))

{

key=o.toString();

o.delete(0,o.length());

s=1;

}

else if(s==1 && x=='\n')

{

if(key!=null && key.length()>0)

strings_.put(key,o.toString());

key=null;

o.delete(0,o.length());

s=0;

}

else

o.append(x);

}

}while((c=is.read(buf))>0);

if(key!=null && key.length()>0)

strings_.put(key,o.toString());

is.close();

}

catch(Exception ex)

{

}

name_=name;

loaded_=true;

}

public String getString(String name)

{

Object o=strings_.get(name);

if(o==null)

return name;

else

return (String)o;

}

}

为了实现通过静态方法访问,修改一下,增加一段代码

static StringManager instance;

public static String get(String name)

{

return instance.getString(name);

}

public static StringManager getInstance(String lang)

{

if(instance!=null)

{

instance.setLang(lang);

}

else

{

instance=new StringManager(lang);

}

return instance;

}

并把构造函数改为private。

有了这样一个StringManager,就可以方便的实现midlet内部的字符串管理了。

初始化管理器: StringManager.getInstance("zh_cn").load("mystrings");//载入/strings/mystrings.zh_cn

使用字符串: StringManager.get("TestMIDlet.Exit");//退出命令

/strings/mystrings.zh_cn文件可以是这样的

TestMIDlet.Exit 退出

TestMIDlet.Done 完成

这种设计的缺点是同一时间只能使用一个资源。

有意见或建议请联系vmlinuxx@gmail.com,共同学习,共同提高:)

(出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航