面试题答案
一键面试底层原理
- 字符编码基础:编码是将字符映射为字节序列的规则。GBK和UTF - 8是两种不同的字符编码方式。GBK是双字节编码,能表示中文字符等;UTF - 8是可变长编码,1 - 4字节表示一个字符,对ASCII字符用1字节表示,对中文字符等常用字符用3字节表示。
- 字符流工作原理:Java字符流(如
Reader
和Writer
及其子类)处理的是字符(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();
}
}
}
在上述代码中:
InputStreamReader
将FileInputStream
包装起来,并指定源文件编码为GBK,从而将GBK编码的字节流转换为字符流。OutputStreamWriter
将FileOutputStream
包装起来,并指定目标文件编码为UTF - 8,从而将字符流转换为UTF - 8编码的字节流写入目标文件。BufferedReader
和BufferedWriter
分别用于提高读取和写入的效率。BufferedReader
的readLine()
方法逐行读取源文件内容,BufferedWriter
的write()
方法将读取的内容写入目标文件,并通过newLine()
方法写入换行符。