J2ME读取UTF-8编码文件方法

   在进入正题前先说点别的,Polish更新到2.0 bate2了,增加了N多东西。看api学习已经变的非常繁重而且不易实现了,看来需要换个学习方法,看例子,可例子也很变态。哎。。看来学习路真难走,2.0增加了JAVA 5大包,还有一个关于mail的大包,其他还有很多,估计出到5.0,就足够和J2SE比大小了……

  因为学习需要,所以做了个J2ME读取UTF-8编码文件,说实话,这不是我的成果,只能算是抄袭,但现在不都讲站在巨人的肩膀上看世界吗,这里感谢主任和giky,没有他们的帮助,我是不可能完成的。

  代码如下(简略版):

    private String name;
   
    private static Font font;

    private final static byte enter_1 = (byte) 0x0D;    //UTF-8编码中换行字节1

    private final static byte enter_2 = (byte) 0x0A;    //UTF-8编码中换行字节2 

 
    private static DataInputStream dis;
   
    private static String[] strTxt;

    //类构造器,我的类名叫ExplorerScreen

    public ExplorerScreen(String name) {
            setFullScreenMode(true);   //全屏
            font = Font.getDefaultFont();  
            this.name = name + ".txt";    //合并文件名
            dis = new DataInputStream(getClass().getResourceAsStream(this.name)); 
            strTxt = readTextUTF8(dis);     //读
            addCommand(new Command("返回", Command.BACK, 1));
            setCommandListener(this);
       
    }

    public void paint(Graphics g) {
        clearScreen(g);   //清屏
        drawBackgroup(g);   //画背景
        g.setColor(redFont, greenFont, blueFont);   //设置字体颜色

        //打印文字
        for (int i = 0, y = 0; i < strTxt.length; ++i) {
            g.drawString(strTxt[i], 0, y, Graphics.TOP | Graphics.LEFT);
            y += font.stringWidth("中");
        }
   }

 

    public static String[] readTextUTF8(DataInputStream dis) {
   
        //实际的行数
        int m = 0 ;                
        //读取的总byte数
        int total = 0;             
        //存放字符串数组开始下标
        int iTmp = 0 ; 
        //存放字符串数组的byte长度
        int len = 0 ;

        //要跳3个字节,因为前3个字节是UTF-8特有的标记
        try {
            dis.skip(3);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        byte[] b = new byte[1024];  //读缓冲
        try {
            total = dis.read(b);   //得到读了多少字节
            System.out.println("total = " + total);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("total = dis.read(b);");
        }
        for (int i = 0; i < total; ++i) {    //判断有多少行
            if (enter_1 == b[i] && enter_2 == b[i + 1]) {
                m++;   
            }
        }   
        String[] s = new String[m];   //建立结果数组,以行数为维数。
        for (int i = 0, z = 0; i < total; i++) {

            //继续判断是否有空格,但这次是为了分行
            if (enter_1 == b[i] && enter_2 == b[i + 1]) {
                len = i - iTmp;   //得到长度
                try {
                    s[z] = new String(b, iTmp, len, "UTF-8");    //转换并保存结果
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    System.out.println("(s[z] = new String");
                }
                iTmp = i + 2;   //后跳2个字节,因为那是换行符
                if (z < s.length) {
                    z++;   
                }
            }
        }
       
        return s;        //返回结果
    }

这样就能正确读出文件内容了,但这不是完善的,因为还不能正确读去不定长文件,也不能正确执行换行,就是当一行输出已经超过屏幕时,它不主动换行,是直接打到手机屏幕外面了,这个留着下午做,今天上午有课,先睡觉休息会……
 

PS:本代码用WTK2.2编译混淆,NOKIA 7610真机测试通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值