基于MIDP实现ResourceBundle类 (转J2meDev.com)

原创 2004年08月29日 13:09:00
  在MIDP中没有提供J2SE平台的ResourceBundle类,因此我自己写了一个。并通过简单的MIDlet程序测试成功。主要的目的是为了解决常量定义的问题,如果把GUI中组件的title的等常量放到一个文件里面调试起来会更方便,本文更重要的目的是告诉读着如何实现在J2ME中遗失的J2SE的类。

    通常我们可以在代码中直接使用常量值或者是专门定义一个放常量的类,例如下面的样子:
Form mianForm = new Form("最差"); Form mainForm = new Form(Title.FORMTITLE);第一种情况是最不可取的,如果修改起来很麻烦。下面我提供了一个 ResourceBundle类,它有一个构造器是
public ResourceBundle(String fileName,int size)第一个参数来指定文件的名字,第二个参数是文件中准备存储多少个选项,一般可以设置的比实际大一些。文件的格式应该是严格按照这样的样子。
0=ming
1=java
2=hello
3=world
4=digital
5=hahaha

把文件的内容进行分析并读取到Vector里面的关键部分是这样实现的:
private void readToVector() throws IOException
    {
        InputStream is = this.getInputStreamFromFile();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int c = 0;
        int index = 0;
        while ((c = is.read()) != -1)
        {
            if (c == '/n' || c == '/r')
            {
                String s = baos.toString();
                int i = s.indexOf('=');
                if (i != -1)
                {
                    if (s.substring(0, i).endsWith(String.valueOf(index)))
                    {
                        indexVector.addElement(s.substring(i + 1).trim());
                        index++;
                    } else
                    {
                        throw new IOException("index error");
                    }
                }
                baos.reset();
            } else
            {
                baos.write(c);
            }
        }
具体的使用方法是这样的
try
{
   ResourceBundle indexBundle = new ResourceBundle("/index.properties",20);
}
catch(IOException e)
{}
String s = indexBundle.getString(3);//任何你想得到的在index.properties中可以找到的title
为了测试这个类的正确性,我写了一个简单的MIDlet程序测试成功。注意我是用的Eclipse因此把文件index.properties是放在res目录里面(如果没有可以自己新建)下面是代码,运行结果是最终在textbox里面显示hello。这是正确的

import java.io.IOException;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class IndexMIDlet extends MIDlet
{
    private ResourceBundle indexBundle;
    private Display display;
    private TextBox box;
    
    
    protected void startApp() throws MIDletStateChangeException
    {
        display = Display.getDisplay(this);
        try
        {
            indexBundle = new ResourceBundle("/index.properties",15);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        box = new TextBox("IndexBundle",null,256,TextField.ANY);
        box.setString(indexBundle.getString(2));
        display.setCurrent(box);
       
    }

   
    protected void pauseApp()
    {
    }

  
    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {
    }

}

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;


public class ResourceBundle
{
    private Vector indexVector;
    private String fileName;
  
    private ResourceBundle()
    {
    }

    public ResourceBundle(String fileName, int size) throws IOException
    {
        this.fileName = fileName;
        indexVector = new Vector(size);
        init();
    }

    private InputStream getInputStreamFromFile()
    {
        return new ResourceBundle().getClass().getResourceAsStream(
                fileName);
    }

    private void init() throws IOException
    {
        readToVector();
    }

    public String getString(int indexID)
    {
        if (indexID < 0 || indexID > indexVector.size())
        {
            return null;
        } else
        {
            return (String) indexVector.elementAt(indexID);
        }
    }

    private void readToVector() throws IOException
    {
        InputStream is = this.getInputStreamFromFile();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int c = 0;
        int index = 0;
        while ((c = is.read()) != -1)
        {
            if (c == '/n' || c == '/r')
            {
                String s = baos.toString();
                int i = s.indexOf('=');
                if (i != -1)
                {
                    if (s.substring(0, i).endsWith(String.valueOf(index)))
                    {
                        indexVector.addElement(s.substring(i + 1).trim());
                        index++;
                    } else
                    {
                        throw new IOException("index error");
                    }
                }
                baos.reset();
            } else
            {
                baos.write(c);
            }
        }
    }

}
index.properties文件内容
0=ming
1=java
2=hello
3=world
4=digital
5=hahaha

ResourceBundle和properties 读取配置文件区别

java.util.ResourceBundle 和java.util.properties 读取配置文件区别   这两个类都是读取properties格式的文件的,而Properties...
  • conolan
  • conolan
  • 2014年11月10日 10:11
  • 1984

ResourceBundle类 可以随意的读取资源文件

Java语言提供了ResourceBundle类来对properties类型的资源文件加以处理。
  • dubuyouta
  • dubuyouta
  • 2014年05月13日 19:31
  • 295

用 ResourceBundle 读取Properties文件以及乱码处理

package read; import java.util.ResourceBundle; /** * 属性文件工厂类 * @author W * @version V1.0 * @dat...
  • amanlyman
  • amanlyman
  • 2013年06月19日 13:42
  • 4863

java实现对属性文件的增删改查以及ResourceBundle使用详解

java实现对属性文件的增删改查以及ResourceBundle使用详解
  • mine_song
  • mine_song
  • 2017年06月01日 10:18
  • 829

Java常用类库——国际化程序(Locale,ResourceBundle以及MessageFormat处理动态文本)

本章目标 掌握国际化程序的基本实现原理。 掌握资源文件的作用。 掌握Locale类的基本实现原理。 掌握ResourceBundle类的作用。 可以使用MessageFormat处理动态文本。 了解资...
  • u013087513
  • u013087513
  • 2016年07月03日 17:29
  • 2681

如何用ResourceBundle来读取配置文件

对于java基础很好的人来说,这个应该是简单的不能再简单的了。不过估计一些ja va新手不一定会知道(比如我,上次为别人写一个东西,需要从外存读文件来设置对象的值,因为不知道 有ResourceBu...
  • u011171998
  • u011171998
  • 2014年02月28日 15:02
  • 480

在J2ME/MIDP中实现图像旋转

摘 要 图形图像的旋转在移动应用程序开发,特别是游戏开发过程中有着现实的需求。但J2ME对此提供的支持却十分有限,如MIDP2.0仅支持图像成90度整数倍的旋转。针对这种情况, 本文提出了一种实现图像...
  • u013399592
  • u013399592
  • 2014年01月06日 17:32
  • 238

java读取properties的方法

在日常使用中经常会读取properties文件,现在把自己在网上搜集的一些java读取properties的方法汇总如下: 1、使用java.util.Properties类的load()方法 ...
  • dengsilinming
  • dengsilinming
  • 2013年01月31日 11:03
  • 18896

父类、子类、接口、多态

1、classpath中".;",一定要放在最前面,避免查找错对象,eclipse无此问题 2、重写函数时一定要从原函数复制函数,避免打错 3、父类引用指向子类对象,对于子类新建的...
  • linhao666
  • linhao666
  • 2017年02月22日 23:21
  • 168

初识国际化和ResourceBundle

初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化,详细的介绍可以看本文的最后。...
  • layman1024
  • layman1024
  • 2017年05月02日 13:12
  • 57
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于MIDP实现ResourceBundle类 (转J2meDev.com)
举报原因:
原因补充:

(最多只允许输入30个字)