本文目录导读:

我来为你详细讲解Java转换流的编码转换案例。
什么是转换流
转换流是字节流和字符流之间的桥梁:
- InputStreamReader:字节输入流 → 字符输入流
- OutputStreamWriter:字符输出流 → 字节输出流
基础编码转换案例
1 读取指定编码的文件
import java.io.*;
public class ReadWithEncoding {
public static void main(String[] args) {
File file = new File("test_gbk.txt");
try (FileInputStream fis = new FileInputStream(file);
// 将字节流转换为GBK编码的字符流
InputStreamReader isr = new InputStreamReader(fis, "GBK");
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2 写入指定编码的文件
import java.io.*;
public class WriteWithEncoding {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("test_utf8.txt");
// 将字符流转换为UTF-8编码的字节流
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw)) {
bw.write("你好,世界!Hello World!");
bw.newLine();
bw.write("Java转换流示例");
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3 完整编码转换示例
import java.io.*;
public class EncodingConverter {
/**
* 转换文件编码
* @param srcFile 源文件路径
* @param srcEncoding 源文件编码
* @param destFile 目标文件路径
* @param destEncoding 目标文件编码
*/
public static void convertFileEncoding(String srcFile, String srcEncoding,
String destFile, String destEncoding) {
try (FileInputStream fis = new FileInputStream(srcFile);
InputStreamReader isr = new InputStreamReader(fis, srcEncoding);
BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream(destFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, destEncoding);
BufferedWriter bw = new BufferedWriter(osw)) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
System.out.println("编码转换完成!");
System.out.println("源文件编码: " + srcEncoding);
System.out.println("目标文件编码: " + destEncoding);
} catch (UnsupportedEncodingException e) {
System.err.println("不支持的编码格式: " + e.getMessage());
} catch (IOException e) {
System.err.println("IO错误: " + e.getMessage());
}
}
public static void main(String[] args) {
// 将GBK编码的文件转换为UTF-8编码
convertFileEncoding("gbk_file.txt", "GBK",
"utf8_file.txt", "UTF-8");
// 将UTF-8编码的文件转换为GBK编码
convertFileEncoding("utf8_file.txt", "UTF-8",
"gbk_file2.txt", "GBK");
}
}
实用工具类
1 通用编码转换工具
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
public class EncodingUtil {
/**
* 获取文件内容的编码
*/
public static String detectEncoding(String filePath) throws IOException {
try (FileInputStream fis = new FileInputStream(filePath);
BufferedInputStream bis = new BufferedInputStream(fis)) {
byte[] bytes = new byte[4];
bis.read(bytes, 0, 4);
// 检查BOM头
if (bytes[0] == (byte)0xEF && bytes[1] == (byte)0xBB && bytes[2] == (byte)0xBF) {
return "UTF-8";
} else if (bytes[0] == (byte)0xFF && bytes[1] == (byte)0xFE) {
return "UTF-16LE";
} else if (bytes[0] == (byte)0xFE && bytes[1] == (byte)0xFF) {
return "UTF-16BE";
}
}
// 如果没有BOM头,默认返回UTF-8
return "UTF-8";
}
/**
* 读取文件内容并转换为字符串
*/
public static String readFileToString(String filePath, String encoding)
throws IOException {
StringBuilder content = new StringBuilder();
try (FileInputStream fis = new FileInputStream(filePath);
InputStreamReader isr = new InputStreamReader(fis, encoding);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
content.append(line).append("\n");
}
}
return content.toString();
}
/**
* 批量转换文件编码
*/
public static void batchConvertEncoding(String directory,
String srcEncoding,
String destEncoding,
String extension) {
File dir = new File(directory);
File[] files = dir.listFiles((d, name) -> name.endsWith(extension));
if (files == null || files.length == 0) {
System.out.println("没有找到需要转换的文件");
return;
}
for (File file : files) {
try {
String destFileName = file.getName().replace(".", "_converted.");
String destPath = file.getParent() + File.separator + destFileName;
convertFileEncoding(file.getAbsolutePath(), srcEncoding,
destPath, destEncoding);
System.out.println("已转换: " + file.getName());
} catch (Exception e) {
System.err.println("转换失败: " + file.getName() + " - " + e.getMessage());
}
}
System.out.println("批量转换完成!共处理 " + files.length + " 个文件");
}
/**
* 转换文件编码(内部方法)
*/
private static void convertFileEncoding(String srcFile, String srcEncoding,
String destFile, String destEncoding)
throws IOException {
try (FileInputStream fis = new FileInputStream(srcFile);
InputStreamReader isr = new InputStreamReader(fis, srcEncoding);
BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream(destFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, destEncoding);
BufferedWriter bw = new BufferedWriter(osw)) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
}
}
}
2 使用示例
public class EncodingDemo {
public static void main(String[] args) {
try {
// 1. 读取GBK编码的文件
String gbkContent = EncodingUtil.readFileToString("data_gbk.txt", "GBK");
System.out.println("GBK文件内容: " + gbkContent);
// 2. 检测文件编码
String encoding = EncodingUtil.detectEncoding("data.txt");
System.out.println("检测到的编码: " + encoding);
// 3. 批量转换Java文件的编码
EncodingUtil.batchConvertEncoding("./src", "GBK", "UTF-8", ".java");
// 4. 完整的编码转换流程
String inputFile = "input_gbk.txt";
String outputFile = "output_utf8.txt";
// 读取
String content = EncodingUtil.readFileToString(inputFile, "GBK");
// 写入到新的编码文件
try (FileOutputStream fos = new FileOutputStream(outputFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw)) {
bw.write(content);
}
System.out.println("编码转换成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
常见编码转换场景
import java.io.*;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class CommonEncodingScenarios {
// 1. 网络请求中的编码转换
public static void handleHttpRequest() throws UnsupportedEncodingException {
String urlParam = "中文参数";
// URL编码 (UTF-8 -> %E4%B8%AD%E6%96%87)
String encoded = URLEncoder.encode(urlParam, "UTF-8");
System.out.println("URL编码: " + encoded);
// URL解码
String decoded = URLDecoder.decode(encoded, "UTF-8");
System.out.println("URL解码: " + decoded);
}
// 2. System.in控制台输入编码转换
public static void readConsoleInput() throws IOException {
// 处理控制台GBK输入(Windows中文系统)
try (InputStreamReader isr = new InputStreamReader(System.in, "GBK");
BufferedReader br = new BufferedReader(isr)) {
System.out.print("请输入中文内容: ");
String input = br.readLine();
System.out.println("输入的内容: " + input);
}
}
// 3. 网络数据流的编码处理
public static void handleNetworkStream() throws IOException {
// 模拟从网络读取UTF-8编码的数据
String networkData = "{\"name\":\"张三\",\"age\":30}";
try (ByteArrayInputStream bais = new ByteArrayInputStream(networkData.getBytes("UTF-8"));
InputStreamReader isr = new InputStreamReader(bais, "UTF-8");
BufferedReader br = new BufferedReader(isr)) {
String jsonData = br.readLine();
System.out.println("网络数据: " + jsonData);
}
}
}
注意事项
1 常用编码
// 常用编码常量
class EncodingConstants {
public static final String UTF_8 = "UTF-8";
public static final String GBK = "GBK";
public static final String GB2312 = "GB2312";
public static final String ISO_8859_1 = "ISO-8859-1";
public static final String UTF_16 = "UTF-16";
}
2 编码检测
// 检测系统默认编码
public class SystemEncodingCheck {
public static void main(String[] args) {
System.out.println("JVM默认编码: " + Charset.defaultCharset());
System.out.println("file.encoding: " + System.getProperty("file.encoding"));
System.out.println("支持的编码:");
Charset.availableCharsets().keySet().stream()
.sorted()
.forEach(System.out::println);
}
}
转换流是Java中进行编码转换的核心工具,通过合理使用InputStreamReader和OutputStreamWriter,我们可以轻松实现各种编码格式之间的转换,在开发过程中,建议:
- 统一编码:项目内尽量统一使用UTF-8编码
- 明确编码:读取文件时明确指定编码格式
- 错误处理:捕获
UnsupportedEncodingException等编码相关异常 - 性能优化:使用缓冲流提高读写效率