`

j2me实现类似j2se中类Properties.java

    博客分类:
  • j2me
阅读更多
实现了J2SE的java.util.Properties类,可以用来读取内容类似下面这样的配置文件:
===============================================
# 这是注释
screen_width=240
screen_height=238
myname = rocks
mybirth = \u00d7\u00f7\u00d5\u00df\u00c9\u00fa\u00c8\u00d5
===============================================
这样使用:
Properties prop = new Properties();
InputStream is = this.getClass().getResourceAsStream("conf.prop");
prop.load(is);
is.close();
String name = prop.getProperty("myname");
...
为了省空间和提高性能我把解析unicode的那部分注释起来了,如果你需要支持中文(就像上面的mybirth那样的),把那些注释起来的代码恢复就可以了。

代码:
--------------------------------------------------------------------------------
package com.joyamigo.util;
import java.io.*;
import java.util.Hashtable;
import java.util.Enumeration;
public class Properties extends java.util.Hashtable {
   
   public Properties() {
       super();
   }
   
 public String getProperty(String key) {
       return (String)this.get(key);
   }
   
   public String getProperty(String key, String defaultValue) {
       Object ret = this.get(key);
       return ret == null ? defaultValue : (String)ret;
   }
           
 public Object setProperty(String key, String value) {
       return this.put(key, value);
   }
   
   public void list(PrintStream out) {
       Enumeration e = this.keys();
       while (e.hasMoreElements()) {
           Object key = e.nextElement();
           Object value = this.get(key);
           out.println(key+"="+value);
       }
   }
   
   public void load(InputStream is) throws IOException {
       this.load(is, "ISO8859_1");
  }
   
   public void load(InputStream is, String enc) throws IOException {
       Reader reader = new InputStreamReader(is, enc);
      boolean reading = true;
       StringBuffer buf = new StringBuffer();
       while (reading) {
           int c = reader.read();
           switch (c) {
           case -1:
              reading = false;
               break;
          case (int)'\r':
               break;
          case (int)'\n':
               Object[] pair = parseLine(buf.toString());
               if (pair != null) {
                   this.put(pair[0], pair[1]);
               }
              buf.setLength(0);
               break;
           default:
               buf.append((char)c);
           }
       }
       Object[] pair = parseLine(buf.toString());
       if (pair != null) {
           this.put(pair[0], pair[1]);
       }
   }
       
   public void store(OutputStream out, String header) throws IOException {
       this.store(out, "ISO8859_1", header);
   }
   
   public void store(OutputStream out, String enc, String header) throws IOException {
       Writer writer = new OutputStreamWriter(out, enc);
       if (header != null) {
           writer.write("#"+header+"\n");
       }
       Enumeration e = this.keys();
       while (e.hasMoreElements()) {
           Object key = e.nextElement();
           String value = (String)this.get(key);
           //writer.write(key+"="+rconvUnicode(value)+"\n");
           writer.write(key+"="+value+"\n");
      }
   }
   private Object[] parseLine(String line) {
       if (line == null || line.trim().length() == 0) {
           return null;
       }
       line = line.trim();
       if (line.startsWith("#") || line.startsWith("!")) { // is comment line
          return null;
       }
       int idx = line.indexOf("=");
       if (idx == -1) {
          //return new String[] { convUnicode(line), "" };
           return new String[] { line, "" };
      } else {
           //return new String[] { convUnicode(line.substring(0, idx).trim()), 
          //                      convUnicode(line.substring(idx+1).trim()) };
           return new String[] { line.substring(0, idx).trim(), 
                                 line.substring(idx+1).trim() };
       }
   }
   /*/
   private static final String convUnicode(String s) {
       int idx = 0;
       int len = s.length();
       StringBuffer buf = new StringBuffer();
       try {
           while (idx < len) {
               char c = s.charAt(idx++);
               if (c == '\\') {
                   c = s.charAt(idx++);
                   if (c == 'u') {
                       StringBuffer tmp = new StringBuffer(4);
                       for (int i = 0; i < 4; i++) {
                           tmp.append(s.charAt(idx++));
                       }
                       buf.append((char)Integer.parseInt(tmp.toString(), 16));
                   } else {
                       buf.append("\\"+c);
                   }
               } else {
                   buf.append(c);
               }
           }
       } catch (StringIndexOutOfBoundsException ex) {
           ;
       }
       return buf.toString();
   }
       
   private static final String rconvUnicode(String s) {
      StringBuffer buf = new StringBuffer();
       for (int i = 0; i < s.length(); i++) {
           char c = s.charAt(i);
           if ((int)c > 127) {
               buf.append("\\u");
               String ss = Integer.toHexString((int)c);
              for (int j = 0; j < 4 - ss.length(); j++) {
                   buf.append('0');
               }
               buf.append(ss);
           } else {
               buf.append(c);
           }
       }
       return buf.toString();
   }
   //*/
}
分享到:
评论

相关推荐

    j2me实现类似j2se中类Properties

    以上就是在J2ME中实现类似J2SE中`Properties`类的方法。虽然没有直接使用内置的类,但通过自定义`Properties`类并利用`Hashtable`,我们依然可以有效地管理和读取配置信息。在实际开发中,可以根据需求扩展这个类,...

    提供j2me使用的优化过的Properties源码

    描述中指出,这个自写的Properties类实现了与J2SE中Properties类类似的功能。这可能包括读取和写入配置文件,支持键值对的存取,以及可能的编码转换等功能。开发者可能还考虑到了J2ME的特殊环境,例如文件I/O操作的...

    JAVA编程基础教程.pptx

    * 在C语言中,可以有多个类在一个文件中,而在JAVA语言中,每个文件只能有一个公共类,该类的名称必须与文件名相同,但以.java为扩展名。 JAVA虚拟机 JAVA虚拟机(JVM)是JAVA语言的核心组件,负责解释和执行JAVA...

    我的所有 JAVA 项目.zip

    Java涵盖了众多子领域,如J2SE(Java标准版)用于桌面应用,J2EE(Java企业版)用于企业级应用开发,J2ME(Java微型版)则针对嵌入式设备。因此,这些项目可能涉及Web开发(使用Spring Boot、Struts等框架),桌面...

    IBM JAVA培训计划

    - Properties、File、Math、System等类的使用 - String与StringBuilder ##### 3. J2SE高级主题 - 文件与流处理 - 多线程编程 - Socket编程 - 异常处理 - 反射机制 - 设计模式 ##### 4. SWING与AWT - GUI编程基础...

    polish.pdf

    - **J2SE**: Java 2 Standard Edition,是Java平台的核心,提供开发和运行桌面应用的环境。 - **Java**: 一种广泛使用的面向对象的编程语言,适用于跨平台应用开发。 - **j2mepolish**: 指的是J2ME Polish工具,已经...

    Derby数据库的使用指南--包括存图片到数据库和读取数据库中的图片操作

    环境:Windows XP professional, JDK 1.6, Eclipse 3.3 安装JDK 6.0之后会安装自带的纯Java的数据derby. 也就是说,如果安装JDK 6.0版本...该数据数应该为J2ME编程带来非常大的好处,同时也为J2SE和J2EE编程来带方便。

    java培训总结

    - 如`java.util`、`java.io`等。 - **字符串(String)**: - 不可变的字符序列。 - 方法: `length()`、`charAt()`、`toString()`等。 - **函数调用**: - 方法的参数传递。 - 返回值。 - **对象克隆(Cloneable)**:...

Global site tag (gtag.js) - Google Analytics