j2me 读取多编码格式外部文本文件

作者:风风 发布于:2010年06月14日 14:43

因为微软的文本txt默认可以保存的编码格式有
UTF-8
Unicode big endian
Unicode
还有ANSI四种
那么就先实现这四个吧

使用起来很方便
调用该类的静态方法readFile,参数给出文件的相对路径和想要的缓冲区空间模式(FILE_SIZE_SMALL, FILE_SIZE_NORMAL,
FILE_SIZE_BIG, FILE_SIZE_MAX)就可以以字符串的形式得到那个文本文件里面的内容了

下面上源代码
1import java.io.IOException;
2import java.io.InputStream;
3
4/** *//**
5 *
6 * 读取外部文本文件
7 * 自动识别编码格式 包括 UTF-8/ Unicode big endian/ Unicode/
8 * ANSI
9 *
10 * 读取完毕返回一个字符串
11 *
12 * @author Colonleado
13 *
14 */
15public class CInputFileStream {
16
17 /** *//**
18 * FILE_SIZE_SMALL 支持256个汉字
19 * FILE_SIZE_NORMAL 支持512个汉字
20 * FILE_SIZE_BIG 支持1024个汉字
21 * FILE_SIZE_MAX 支持2048个汉字
22 */
23 public static final byte FILE_SIZE_SMALL = 0, FILE_SIZE_NORMAL = 1,
24 FILE_SIZE_BIG = 2, FILE_SIZE_MAX = 3;
25
26 /** *//**
27 * 索引编码头
28 */
29 private static final int CODE_Unicode = 0xFFFE,
30 CODE_Unicode_big_endian = 0xFEFF, CODE_UTF_8 = 0xEFBBBF;
31
32 /** *//**
33 * 读取一个外部文件
34 * 可以是Unicode或Unicode_big_endian或UTF_8任何一种编码格式 自动识别
35 * 注意ANSI并不能储存中文
36 * 所以如果你的文本文件保存为ANSI并且内含中文那么读取出来将会是乱码
37 * 也就是说ANSI格式的文本只能包含数字和字母且不要有中文的标点
38 *
39 * @param path
40 * @param fileSizeMode
41 * @return
42 * @throws Exception
43 */
44 public static String readFile(String path, byte fileSizeMode)
45 throws Exception {
46 byte buf[] = null;
47 int size = 0;
48 switch (fileSizeMode) {
49 case FILE_SIZE_SMALL:
50 buf = new byte[512];
51 break;
52 case FILE_SIZE_NORMAL:
53 buf = new byte[1024];
54 break;
55 case FILE_SIZE_BIG:
56 buf = new byte[2048];
57 break;
58 case FILE_SIZE_MAX:
59 buf = new byte[4096];
60 break;
61 }
62 InputStream is = new Object().getClass().getResourceAsStream(path);
63 if (is.markSupported()) {
64 is.mark(0);
65 } else {
66 throw new Exception(”不支持Mark的输入流”);
67 }
68 byte codeTypeBuf[] = new byte[2];
69 is.read(codeTypeBuf);
70 int codeType = ((codeTypeBuf[0] & 0xff) << 8) | (codeTypeBuf[1] & 0xff);
71 switch (codeType) {
72 case CODE_Unicode:
73 // Unicode
74 StringBuffer sb = new StringBuffer();
75 size = read(is, buf);
76 for (int j = 0; j < size;) {
77 int l = buf[j++];
78 int h = buf[j++];
79 char c = (char) ((l & 0xff) | ((h << 8) & 0xff00));
80 sb.append(c);
81 }
82 return sb.toString();
83 case CODE_Unicode_big_endian:
84 // Unicode big endian
85 sb = new StringBuffer();
86 size = read(is, buf);
87 for (int i = 0; i < size; i += 2) {
88 int cha = ((buf[i] & 0xff) << 8) | (buf[i + 1] & 0xff);
89 sb.append((char) cha);
90 }
91 return sb.toString();
92 }
93
94 is.reset();
95 codeTypeBuf = new byte[3];
96 is.read(codeTypeBuf);
97 codeType = ((codeTypeBuf[0] & 0xff) << 16)
98 | ((codeTypeBuf[1] & 0xff) << 8) | (codeTypeBuf[2] & 0xff);
99 if (codeType == CODE_UTF_8) {
100 // UTF-8
101 size = read(is, buf);
102 return new String(buf, 0, size, “UTF-8″);
103 }
104
105 // other
106 is.reset();
107 size = read(is, buf);
108 return new String(buf, 0, size);
109 }
110
111 private static int read(InputStream is, byte buff[]) throws IOException {
112 int kl = 0;
113 kl = is.read(buff);
114 if (is != null) {
115 is.close();
116 }
117 return kl;
118 }
119
120}

作者:风风
来源:北风技术专栏
原文链接:http://column.ibeifeng.com/allg0/20100614312.shtml

( 内容完 )

添加收藏到:

您可能还对这些文章感兴趣:

  • 你走你的阳光道,我走我的独木桥:整合ant ivy 和testng
  • 详谈基于JSON的高级AJAX开发技术
  • java web程序究竟该如何布署?
  • 如何优化SQL Server数据库性能之SQL语句篇
  • 修改对象私有属性
  • 基于EJB3.0的留言板项目的开发全过程
  • 认识安全框架acegi(2)
  • 认识安全框架acegi(5)
  • 认识安全框架acegi(3)
  • 数据库设计三大范式应用实例剖析
  • 没有评论, 我来评论

    小贴士:评论需要管理员审核后才会显示。请不要发布与国家法律相抵触的言论,北风网将保留追究责任的权利。
    类似“顶”、“沙发”、“支持”之类没有营养的文字,对勤劳贡献的作者来说是令人沮丧的反馈信息。
    请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
    如果您发现自己的评论没有被审核或者不见了,请参考以上三条。

    

    每周之星

    陈臣陈臣

    七年Java和JEE开发经验,JEE应用设计和高级架构师,拥有Sun的多项Java和J2EE方面的技能认证,多年项目经理、技术部经理的管理经验。拥有全面、扎实的Java和JEE理论知识,丰富的JEE应用开发经验。

    更多作者:

  • Adam
  • ikon999
  • jk1234
  • jk2345
  • libin_8745
  • lifengxing
  • taohuang100
  • xingkong
  • 北风
  • 呆子
  • 子晨
  • 小白
  • 张章
  • 张维亮
  • 陈臣
  • 陶宝哥
  • 风风
  • 最新内容

    推荐内容

    标签

    分类