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真机测试通过。