Fullstar

Archives

  • December 2025
  • August 2024
  • July 2024
  • February 2024
  • November 2023
  • August 2023
  • July 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • February 2022
  • January 2022
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020

Categories

  • Code
  • Lens
  • Life
0
Fullstar
  • Code

Java 编码

  • July 31, 2020
  • Brandon
Total
0
Shares
0
0
0

一.乱码问题

使用 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"));//重命名暂存文件
Total
0
Shares
Share 0
Tweet 0
Pin it 0
Brandon

Previous Article
  • Code

Java IO流

  • July 31, 2020
  • Brandon
View Post
Next Article
  • Code

SQL存储函数、过程、视图、游标、触发器

  • August 2, 2020
  • Brandon
View Post
You May Also Like
View Post
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • Brandon
  • December 14, 2025
View Post
  • Code

WordPress image offload

  • Brandon
  • December 14, 2025
View Post
  • Code

ComfyUI应用手册

  • Brandon
  • December 6, 2025
View Post
  • Code

Leetcode Java常用代码

  • Brandon
  • February 17, 2024
View Post
  • Code

Golang入门

  • Brandon
  • February 4, 2024
View Post
  • Code

Setting Up and Maintaining a Ubuntu Environment for My Home Server

  • Brandon
  • November 24, 2023
View Post
  • Code

Swift Learning Log

  • Brandon
  • August 31, 2023
View Post
  • Code

English Learning – Food Related

  • Brandon
  • August 31, 2023

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Fullstar

Input your search keywords and press Enter.