1. 程式人生 > >J2ME讀取UTF-8編碼檔案方法

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真機測試通過。