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