MST
星途 面试题库

面试题:Java字符流编码转换原理及实践

阐述Java字符流在处理文本数据时,从一种编码格式转换为另一种编码格式的底层原理。假设要将一个GBK编码的文本文件内容读取并以UTF - 8编码写入另一个文件,使用Java字符流相关类编写代码实现此功能。
38.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

底层原理

  1. 字符编码基础:编码是将字符映射为字节序列的规则。GBK和UTF - 8是两种不同的字符编码方式。GBK是双字节编码,能表示中文字符等;UTF - 8是可变长编码,1 - 4字节表示一个字符,对ASCII字符用1字节表示,对中文字符等常用字符用3字节表示。
  2. 字符流工作原理:Java字符流(如ReaderWriter及其子类)处理的是字符(char),而不是字节。在处理编码转换时,字符流会先将字节数据按照源编码格式解码成字符,然后再将这些字符按照目标编码格式编码成字节。例如,从GBK编码文件读取数据时,InputStreamReader会根据GBK编码规则将字节序列转换为字符序列,然后OutputStreamWriter会根据UTF - 8编码规则将字符序列转换为字节序列写入目标文件。

代码实现

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class EncodingConverter {
    public static void main(String[] args) {
        String sourceFilePath = "sourceGBK.txt";
        String targetFilePath = "targetUTF8.txt";

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFilePath), "GBK"));
             BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFilePath), "UTF-8"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中:

  1. InputStreamReaderFileInputStream包装起来,并指定源文件编码为GBK,从而将GBK编码的字节流转换为字符流。
  2. OutputStreamWriterFileOutputStream包装起来,并指定目标文件编码为UTF - 8,从而将字符流转换为UTF - 8编码的字节流写入目标文件。
  3. BufferedReaderBufferedWriter分别用于提高读取和写入的效率。BufferedReaderreadLine()方法逐行读取源文件内容,BufferedWriterwrite()方法将读取的内容写入目标文件,并通过newLine()方法写入换行符。