鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 手机系统开发 > J2ME > >

j2me实现j2se的Properties功能

来源:互联网 作者:佚名 时间:2015-08-02 08:07
欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入 我们知道 j2me 中没有 j2se 里边的 Properties 类,要自己实现才能像 j2se 那样读取文件的,现在 j2mepolish 里边的 de.enough.polish.util.Properties 就实现了类似 j2se 的 Properties, 加上de.en
欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入

        我们知道 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文件:

Java代码
name=muscle-liu 
sex=male 
age=24 
name=muscle-liu
sex=male
age=24


读取时的部分代码:

Java代码
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")); 
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"));


运行结果如下:

Java代码
prop.getProperty("name"): muscle-liu 
prop.getProperty("sex"): male 
prop.getProperty("age"): 24 
prop.getProperty("name"): muscle-liu
prop.getProperty("sex"): male
prop.getProperty("age"): 24


在运用中我发现这个 Properties 类有个 bug,就是不支持 # 的注释(也就是说,属性文件里边除了 key-value 的内容,不能有其他的非 k-v 内容)。下边是我修改 Properties 里边的 load 方法,令它支持 # 注释:
原来的 load 方法:

Java代码
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; 
            } 
        } 
    }    
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 );

[1] [2] [3] [4] 

网友评论
<