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