网上或者大部分书上都说Java中输出中文使用FileReader类就可以了,但是当你读取一个中文文档时,你会发现,除了乱码,还是乱码。究其原因,这其实是文件流读取时使用的编码方式和文件本身编码方式不同,造成读取出来文件乱码。还有一个细节,当你使用read()直接读取字符输出时,无论如何都是读不出中文的。关于这类问题,给出两种解决方案:
一、使用BufferedReader类包装一下FileReader类,然后使用BufferedReader::readLine()方法读取一行的String,然后用这个String再去构造一个新的String输出,具体如下:
FileReader f = new FileReader("test.txt"); BufferedReader is = new BufferedReader(f); String str = null; while((str = is.readLine()) != null){ System.out.println(new String(str.getBytes("GBK","utf-8")); }
这样就能输出大概正确的中文了。为什么说是大概呢?因为它可能还会有“???”或者其他一些糟心的符号。因此这种方法并不完美。另一种方法如下:
二、使用FileInputStream类读取文件,然后使用InputStreamReader类来封装,最后再使用BufferdReader来读取一行:
FileInputStream f = new FileInputStream("test.txt"); InputStreamReader is = new InputStreamReader(f,"utf-8"); BufferedReader ret = nrew BufferedReader(is); String str = null; while((str = ret.readLine()) != null){ System.out.println(str); }
使用这种方法就能完美显示中文,而没有乱码。但是要求中文文本使用utf-8编码。
另外,还有一种编码是utf-8-BOM编码,这种编码和utf-8不一样,他在文件开头有三个字节的标识符,如下图第一行:
ef bb bf 就是文件标识符,上图中第一行是utf-8-BOM的“我是陈宇翔”的十六进制编码,第二行是utf-8的“我是陈宇翔”的十六进制编码。我们发现,第一行的后十五个字节和第二行完全一样。所以当你使用utf-8-BOM的文档,而使用utf-8方式去读取时,输出的第一个字符会是乱码。同时我们还发现,utf-8编码的中文字符是三字节的。