Java 编码

一.乱码问题

使用 FileReader 读取文件时,可以正常读取IDE默认编码格式(UTF-8)的文件,但若读取系统默认编码(中文GBK)则会产生乱码如: ���。当用记事本写入内容并保存为不同的编码时其保存的二进制码也是不同的,如UTF-8编码使用3个字节保存一个中文,GBK用2个字节保存一个中文。FileReader 底层为 FileInputStream ,在以字节流的方式读入后查询IDE默认码表,并用此码表进行转换,因此若文件保存为GBK,而 FileReader 使用 UTF-8 进行解码,二者并不匹配,因此产生乱码。

同样的,在使用 FileWriter 进行文件写入时,其首先查询IDE默认编码表,将字符转换为字节,再利用 FileOutPutStream 将字节流输入文件,此时文件内的编码即为IDE默认编码,而若想更改编码类型,则可以使用 OutputStreamWriter 指定编码表进行输出。

二.转换流转换流程图示

使用 InputStreamReader 进行转换时可自行指定编码表,从而防止乱码

InputStreamReader流程

使用 OutputStreamWriter 可自行指定文件保存所用编码表

OutputStreamWriter流程

三. OutputStreamWriter 的使用

OutputStreamWriter 继承自 BufferedOutputStream

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("out.txt"),"gbk");
outputStreamWriter.write("中文你好");
outputStreamWriter.flush();
outputStreamWriter.close();

四. InputStreamReader 的使用

InputStreamReader 继承自 BufferedInputStream

InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("test.txt"),"gbk");
int len = 0;
while((len = inputStreamReader.read())!=-1){
      System.out.print((char)len);
}
inputStreamReader.close();

五.实现文本编码转换器

File file = new File("out.txt");//原文件
File temp = new File("temp.txt"); //暂存文件
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file),"gbk");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(temp),"utf-8");
int len = 0;
while((len = inputStreamReader.read())!=-1){
      outputStreamWriter.write(len);
      }
inputStreamReader.close();
outputStreamWriter.close();
file.delete();//删除原文件
temp.renameTo(new File("out.txt"));//重命名暂存文件

Related post

  1. 基于RNN的自动文本生成

    2020-07-22

  2. 网址收藏夹

    2020-07-16

  3. Emacs配置python环境

    2022-11-07

  4. Windows下ARM编程实验

    2020-11-29

There are no comment yet.

COMMENT

Take a Coffee Break

Recommend post

  1. 常用工具指令

    2022-09-18

Category list

ABOUT

Welcome to FullStar, a captivating online destination where the realms of software development and personal reflections intertwine.

May 2025
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  

Life Logs

  1. 回首

    2023-07-14

Return Top