张生工作室

一切皆有可能

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  24 随笔 :: 3 文章 :: 11 评论 :: 0 Trackbacks

#

     摘要:   /**//*  * TextBoxTest.java  *  * Created on 2007年9月9日, 下午12:28  */ import java.io.ByteArrayOutputStream; import java.io.IOExcepti...  阅读全文
posted @ 2007-09-09 21:33 张生工作室 阅读(359) | 评论 (0)编辑 收藏

在J2ME中读取各种格式的文本文件

在J2ME开发过程中,我们经常会把一个文字信息保存在txt格式的文本文件中做为资源.这样便于修改和管理.那么读取它们对于一些刚接触j2me的朋友会有些困难.前几天研究了下,看了一些兄弟的文章和代码,总结出3种方法分别读取Unicode,UTF-8,Unicode big endian格式的文件...本文没考虑读取的效率问题.

这三种方法都能读取中文和英文字符.用来存放的数组长度视文本长度而定....

另外还有一些只能读取英文字符的方法就不列举出来了.

一,读取Unicode格式

    private String read_Uni(String resource)
    {
        byte word_uni[]=new byte[1024];
        String strReturn="";
        InputStream is;
        try
        {
            is=getClass().getResourceAsStream(resource);
            is.read(word_uni);
            is.close();
            StringBuffer stringbuffer = new StringBuffer("");
            for (int j = 0; j < word_uni.length; )
            {
              int k = word_uni[j++]; //注意在这个地方进行了码制的转换
              if (k < 0)
                k += 256;
              int l = word_uni[j++];
              if (l < 0)
                l += 256;
              char c = (char) (k + (l << 8)); //把高位和低位数组装起来
              stringbuffer.append(c);
            }
            strReturn=stringbuffer.toString();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            is=null;
        }
        return strReturn;
    }

二,读取UTF-8格式

    public String read_UTF(String name)
    {
        String strReturn = "";
        InputStream in = null;
        byte[] word_utf= new byte[1024];
        try
        {
          in = getClass().getResourceAsStream(name);
          in.read(word_utf);
          in.close();
          strReturn=new String(word_utf,"UTF-8");
        }
        catch(Exception e)
        {
          System.out.println("readUTF Error:"+e.toString());
        }
        finally
        {
          in = null;
        }
        return strReturn;
    }

三,读取Unicode big endian格式

读取Unicode big endian格式时,采用readChar()方法读取,所以存放时使用char数组存放.

注意:在文本的末尾加上'$'表示文本的结束.

另外代码第10行dis.skip(2)是略过文件头2个字符,如果用microsoft notepad保存的一定存在这两个头字符.

当然,可以使用UltraEdit可以先删掉这两个头字符,然后使用新建文件,复制粘贴,保存为其它格式.这样两个头字符就没了..

    private String read_Uni_b_e(String resource)
    {
        char word_uni_b_e[]=new char[1024];
        String strReturn="";
        DataInputStream dis;
        try
        {
            dis=new DataInputStream(getClass().getResourceAsStream(resource));
            int counter=0;
            dis.skip(2);
            char temp;
            while(true)
            {
                temp=dis.readChar();
                if(temp=='$')
                    break;
                word_uni_b_e[counter++]=temp;
            }
            dis.close();
            strReturn=String.valueOf(word_uni_b_e,0,counter);
        }
        catch(Exception e)
        {
            System.out.println("read_Uni_b_e error!"+e.getMessage());
        }
        finally
        {
            dis=null;
        }
        return strReturn;
    }

以上3种方法测试平台:

Operation System: Microsoft Windows XP Professional Service Pack 1

Emulator: Sun Wireless ToolKit 2.2 beta DefaultColorPhone

posted @ 2007-09-09 19:48 张生工作室 阅读(230) | 评论 (0)编辑 收藏

J2ME平台下文本阅读器的实现

J2ME平台下文本阅读器的实现

摘要:本文利用J2ME技术开发了一个文本阅读器,实现了手机对文本文件的显示,给出了该程序的实现代码,并对其关键技术进行了详细阐述。
关键字:   J2ME 文本阅读器 Java 手机

0引言
    随着通讯技术的发展及手机的普及 ,人们正在不断地给手机增加新的功能 ,其中 ,使手机实现一般只有 PC机才具有的功能——下载各种程序并运行 ,是目前手机发展的一个重要方向。为此 ,人们提出了各种各样的解决方案 ,其中基于 JAVA的 J2 ME方案无疑是最引人注目的。
    本文通过J2ME开发一个文本阅读器,该程序可下载到手机上,随时随地的进行阅读,这样就可以通过这种方式开发一些学习软件,使手机用户可有一个随身学习的工具书。由于J2ME不可以对手机中的文件进行读写,所以在开发本程序时,只能在程序打包时把文本文件作为资源文件加入到J2ME发布程序中。如果想读写手机上的文件,则要使用各手机商家提供的特定开发平台和专用的类来开发,下面就文本阅读器的关键技术进行说明。
1 J2ME文本阅读器中的文本格式
    J2ME中文本文件的格式,为了便于程序的开发和在运行中的读写处理,对要处理的文本文件要进行一定格式的整理。本程序中的文本要求用纯文本即可,每章为一个独立的文件,每一章中均可为多段,在文本中加入的空格和各种符号都可在阅读时如实的显示出来。文件写好后将其存入相应项目文件夹下的res文件夹中,如本文中的阅读器的项目名为test,则可将文本文件存入test\res文件夹下。
    本系统要阅读三章内容,所以制作了三个文本文件,分别命名为test1.txt、test2.txt、test3.txt,将三个文件存入test\res文件夹中,到此文本内容准备完成。

2读取文本文件的主要技术问题
    在J2ME中如何读取文本文件的内容,在本系统中写了一个函数用来读取指定的文本文件,文本文件做为参数传给该函数,该函数的返回值为字符串类型,将文件的内容做为一个完整的字符串返回。在读取文件内容时用到的主要技术,使用InputStream类定义一个输入字节流对象in,使用 ByteArrayOutputStream类定义一个内存数组输出字节流对象s,通过输入对象的in.read()方法来读取一个字节,将读出的字节通过s.write( )方法加入到s中,再使用s.toString()方法将内存转为字符串返回。读取文本文件的函数定义如下:
    private String myReadLine (String testFileName) {
        //函数头定义了函数的参数为文件名组成的字符串,返回值为一个字符串。
  InputStream  in = this.getClass().getResourceAsStream(testFileName);
        //由文件名参数来定义一个输入流对象变量in
    ByteArrayOutputStream  s;
    s = new ByteArrayOutputStream();  //产生内存数组输出字节流对象变量S
    try{
        int ch=0;
        ch=in.read();  //由输入流对象变量in的read方法以字节为单位来读取文件的内容,读取到文件尾时的值为-1。  
        while ( ch!= -1 ) {
          //如果未读到文件尾把读取的内容写入S变量中,并读取下一字节内容
                s.write( ch );
                ch=in.read();
            }
            in.close();  //关闭输入流对象。
        }  catch (IOException ioe){
           System.out.println(ioe.toString());
        }
        String str = s.toString();  //将S变量转为字符串
        try{
            s.close();  //关闭输出流对象
        }  catch (IOException ioe){
           System.out.println(ioe.toString());
        }
        return  str.trim();  //返回文件中的内容字符串
    }

3 将文本文件内容显示出来的技术
    通过Form类定义一个表单对象f,通过对象的f.append()的方法将读取文本文件返回的字符串内容加入到表单对象中,为了该表单内容在阅读完之后可以返回上一级显示界面,通过f.addCommand()方法在表单中加入一个按钮对象,并通过f.setCommandListener(this)方法注册CommandListener高级事件处理,这样当选择按钮时即可调用CommandListener 高级事件接口类中的commandAction()函数,在该函数中判断是哪个按钮被选中,通过该函数中的代码来决定处理流程。最后通过Display类的Display.setCurrent()方法将含有文件内容的表单显示在手机屏幕上。处理代码如下:
    Form f=new Form("超级阅读"); //创建一个Form对象f
    strContent=myReadLine ("/test1.txt"); //读取test1.txt文件中的内容返回字符串
    f.append(strContent);  //将文本文件的内容加入到f对象中
  f.addCommand(exitCom);  //将退出按钮选项加入到f对象中
f.setCommandListener(this);  //注册高级事件处理
    display.setCurrent(f);  //将f对象显示到手机屏幕上

4 阅读器中的菜单设计技术
    本阅读器菜单结构分两级,一级菜单显示各章的标题,通过选择某一标题选项进入该章进行内容阅读,在章内容界面中设置二级菜单选项,二级菜单中只有一个选项即是返回选项,选中该选项后,则回到上一级,可重新选择章标题,进入新一章内容进行阅读。一级菜单通过List类来建立,首先产生一个List类的对象l,通过l.append("第一章",null)方法在l对象中加入一条选项,用同样的方法可加入多条选项,只要将第一章改为第二章、第三章等,可产生一个有多选项的l对象,通过l.addCommand(exitCommand)方法在l对象中加入一个按钮,作为退出按钮选项,通过l.setCommandListener(this)注册高级事件处理机制,通过该高级事件的注册在操作过程中选中某一选项时,系统自动调用commandAction()函数,并将选中的选项做为参数传递给该函数,在函数中判断选中的是哪一个选项,进行不同的流程处理。最后通过Display类的Display.setCurrent(l)方法将第一级菜单界面显示在手机屏幕上。一级菜单界面的定义如下:
List l=new List("超级阅读--小说",Choice.IMPLICIT);  //定义一个List对象l
  l.addCommand(exitCommand);  //在对象l中加入退出按钮
  l.append("第一章",null);  //加入第一章选项标题
l.append("第二章",null);  //加入第二章选项标题
l.append("第三章",null);  //加入第三章选项标题
l.setCommandListener(this);    //注册高级事件处理机制
  display.setCurrent(l);    //将界面显示在手机屏幕上
    在阅读器的菜单设计中,无论是选择了章标题选项,还是选择了一级菜单中的退出或者是阅读章内容界面中的退出选项,都将进入commandAction()函数中,在该函数中进行相应判断进入不同的处理流程代码。
    主要程序代码如下:
public void commandAction(Command c,Displayable s)
  {
     if(c==exitCommand)
       {//如果是一级菜单的退出按钮选项则退出本系统
      notifyDestroyed();
          }
else if (c==exitCom)
          {//若是阅读章内容中的退出按钮选项则退出阅读内容界面返回一级菜单界面
       startApp();
       resumeRequest();
          }
else  
          {//如果选择的不是任何一个退出按钮,则进行选择章标题的判断
              String strContent;
            List tmp=(List)s;  //将参数s进行类型转换,转换为List类对象
            switch(tmp.getSelectedIndex())  
//判断选中的是哪一章标题则进行该章内容阅读界面
           {   case 0:
                        //第一章选中打开test1.txt
                    Form f=new Form("超级阅读");
                        strContent=myReadLine ("/test1.txt");
                        f.append(strContent);
                   f.addCommand(exitCom);
                   f.setCommandListener(this);
                   display.setCurrent(f);
                break;
            case 1:
                        //第二章选中打开test2.txt方法同第一章(略)
                  case 2:
                      //第三章选中打开test3.txt,如果还有更多章可按此方法再增加
                    
           }  // switch 多分支结构语句结束
         }  //if  选择结构结束
  } // commandAction函数结束

posted @ 2007-09-09 19:25 张生工作室 阅读(331) | 评论 (0)编辑 收藏

 

完成最简单的闹铃功能 
/*
* Midlet.java
*
* Created on 2007年9月8日, 下午12:24
*/


package hello;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
*
@author    Administrator
@version
*/

public class Midlet extends MIDlet implements javax.microedition.lcdui.CommandListener,javax.microedition.lcdui.ItemStateListener {
      
private     Display display;
       
private     Form form;
       
private DateField setAlarm;
       Alert alert;
       Command exitCmd;
       Command cancelCmd;
       Timer alarmTimer;
       MyTimerTask alarmTask;
       Date current;
       
boolean firstTime=true;
    
      
public Midlet()
      
{
            display
=Display.getDisplay(this);
            form
=new Form("设定闹铃");
            alert 
=new Alert("");
            alert.setTimeout(Alert.FOREVER);
            form.append(
"这是我第一次开发手机程序");
            alert.setString(
"时间到了");
          
            setAlarm
=new DateField("设定时间",DateField.DATE_TIME);
            exitCmd
=new Command("退出",Command.EXIT,1);
            cancelCmd
=new Command("关闭铃声",Command.CANCEL,1);
            current
=new Date();
            alarmTimer
=new Timer();
            alarmTask
=new MyTimerTask();
            form.append(setAlarm);
            form.setCommandListener(
this);
            form.addCommand(exitCmd);
            form.addCommand(cancelCmd);
            form.setItemStateListener(
this);
            alarmTimer
=new Timer();
            alarmTask
=new MyTimerTask();
          
          
      }

      
public void startApp() {
          display
=Display.getDisplay(this);
          display.setCurrent(form);
        
        
      
      }

    
      
public void pauseApp() {
      }

    
      
public void destroyApp(boolean unconditional) {
      }


      
public void commandAction(Command command, Displayable displayable) {
        
          
if (command==exitCmd)
          
{
              destroyApp(
false);
              notifyDestroyed();
          }

          
else
              
if(command==cancelCmd)
              
{
              alarmTimer.cancel();
              }

      }


      
public void itemStateChanged(Item item) {
          Date setting
=setAlarm.getDate();
          
if (setting.getTime()>current.getTime())
          
{
              alarmTimer.scheduleAtFixedRate(alarmTask,setting,
2000);
          }

      }

    
      
class MyTimerTask extends TimerTask
{
     
public void run()
     
{
        
if (firstTime)
        
{
            display.setCurrent(alert,form);
            firstTime
=false;
        }

        AlertType.CONFIRMATION.playSound(display);
     }

   
}


}

posted @ 2007-09-08 21:27 张生工作室 阅读(212) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3