想用RandomAccessFile读取一个中文文件,文件是个用XP下记事本保存的以UTF-8编码的文本文件.
我先读取了2个字节,第一个字是中文.
RandomAccessFile reader = new RandomAccessFile(sourceFile, "r");
byte[] buff = new byte[2];
reader.readByte(buff);
System.out.println(new String(buff,"UTF-8");
这样出现的不是问号就是乱码,请问应该如何读取?

解决方案 »

  1.   

    为什么不一行一行的读呢
    String str=reader.readLine();System.out.println(new String(str,"UTF-8"));
      

  2.   


    因为它的每个读取都是读一个byte,由于UTF-8的编码模式是
    1110位15-12
    10位11-6
    10位5-0因此你每次读出来的数都是负数,因此无法处理建议在随机存取的时候不要有中文字符,如果有中文字符就用其它的类来实现。
      

  3.   

    我可以读取单个字节根据UTF-8的标志位来判断吧?
    因为要我要读取的只是个很大文件的极小部份,分散在文件中。所以我想这种方法最快了。
    看了上面的回复我本想这样做的,如果是UTF-8汉字那么应该是1110xxxx作为第一个字节的。和0xffff与一下,如果结果是-17那么就再读取2个字节。3个字节放在一个类型是byte长度为3的数组中buff。
    new String(buff,"UTF-8")这样来得到结果。
    可是和我想的好像还是有点出入
      

  4.   

    原来是windows的记事本在保存成UTF-8时会写入EF BB BF3个字节。后面开始才是正文。
      

  5.   

    我以前也没注意这些 看到这个贴才去看的API 然后发现的不知道LS有什么高见?
      

  6.   

    我以前也没注意这些 看到这个贴才去看的API 然后发现的不知道LS有什么高见?
      

  7.   

    你必须明白UTF-8编码的原则,还有你设置缓冲区太小了,就2byte 汉字一般是3byte,肯定是乱码了
    http://hi.baidu.com/1liufeilong/blog/item/0e15f80fff1f63f2aa6457da.html
    这个你可以看看,应该会明白点