本文目录导读:

我来为你详细讲解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等编码相关异常 - 性能优化:使用缓冲流提高读写效率
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播