我用下面代码读取编码格式为GBK的资源文件时,如果文件内容为英文,这样可以一次性读取,而如果内容为中文的话,创建的chars 数组的空间就会大出一倍,浪费了资源,只好用char[] chars = new char[is.available() / 2];来处理,如果是混合数据时就更不好说了,代码如下:
InputStream is = getClass().getesourceAsStream(resourceName);char[] chars = new char[is.available()];
InputStreamReader isr = new InputStreamReader(is);
StringBuffer tmpBuffer = new StringBuffer();while (isr.read(chars) != -1) {
    tmpBuffer.append(chars);
}其实我的目的想实现一次性读取资源文件的内容,即传入正确地char[] chars = new char[right number],来达到加快读取的速度,如果我用byte[] bytes = new byte[is.available()];来读取编码为UTF-8的文件,则可以一次性读取,但上述情况就不行,用InputStreamReader读取GBK编码的文件,用is.available()读中文时返回的是双字节,即创建了双倍大小的缓冲数组,而isr.read(chars)读取的GBK编码文件的中英文只占一个字符,这样如果资源文件的内容为{你好,hello}的话,创建的数组大小为11,而isr.read(chars)读入的字符为8,后面三位为空,造成了资源浪费,所以想请大家给个解决思路,谢谢!

解决方案 »

  1.   

    hehe, 又见面了  :)我觉得,你要实现的目标是不可能的。如果我没理解错的话,你是想事先得到文件的“字符数”,而现在你只能得到“字节数”,对吧?GBK 和 UTF-8 等编码方式,都属于 MBCS(Multibyte Character Set),它只有在指定了某个 encoding 之后才能根据“字节串”解析得到“字符串”,然后才能知道“字符数”。只有 DBCS(Doublebyte Character Set)和 SBCS(Singlebyte Character Set)才能根据“字节数”直接推算出“字符数”。话说回来,我有两点疑问:1. “一次性读取”真的能提高效率吗?能提高多少呢?值得吗?2. 用 btye[] 的方式先读进来,然后再 new String(ba) 也不错啊?
      

  2.   

    呵呵,这是你答的第三个问题了!
    你的理解没错,就是想得到文件的字符数,不过中间那句没有完全弄明白。
    你的疑问我可以这么解释:
    代码是J2ME的,运行在手机中,在有限的内存资源和cpu处理能力的情况下,部分优化还是可以带来性能提升的
    用UTF-8编码的资源文件,再用InputStream来读,可以一次性读取,已经实现,但针对那些是GBK编码的文件,InputStreamReader读就未能达到预期的效果,:P,其实这也是一个试验而已,有点类似与上例的type=0或是1一样,两种实现方式而已
      

  3.   

    haha,原来是“第三个”啦,我还以为是“第二个”(因为“第一”个没注意到)  ;)MBCS 的意思就是,用这种编码方式进行编码的字符串,有些字符占一个字节,有些字符占两个字节(好像是废话,hehe),所以,不对“字节串”进行从头到尾的逐个解析,是没办法知道“字符数”的。提个建议吧,你可以考虑把文件的“字符数”先数出来,然后用某种办法告知你的程序。比如另外定义一个“字符数文件”,或者把字符数写在那个资源文件的开头,或者把字符数写在文件名里。
      

  4.   

    不如有空的话帮我看看第四个问题,有没有更好的思路
    http://community.csdn.net/Expert/topic/4918/4918607.xml?temp=.233761
      

  5.   

    按照你的观点,就是读取GBK编码的文件然后放入到一个StringBuffer中供以后利用。
    InputStream is = getClass().getresourceAsStream(resourceName);
    InputStreamReader isr=new InputStreamReader(is,"GBK");/*inputstreamreader可以将inputstream转换为字符串类型的数据,而不是字节类型的数据。GBK表示转换为字节转换为字符的字符集编码*/
    BufferdReader br=new BufferedReader(isr);/*取代了StringBuffer的功能进行缓存*/
      

  6.   

    呵呵,没有理解错的话,你的意思是通过这样设置后,再通过BufferdReader.readLine()的方式来提高读取速度吧!
    但不好意思,BufferdReader在本例的MIDP中不支持,谢谢!