Java转换流案例怎么编码转换

wen java案例 22

本文目录导读:

Java转换流案例怎么编码转换

  1. 什么是转换流
  2. 基础编码转换案例
  3. 实用工具类
  4. 常见编码转换场景
  5. 注意事项

我来为你详细讲解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中进行编码转换的核心工具,通过合理使用InputStreamReaderOutputStreamWriter,我们可以轻松实现各种编码格式之间的转换,在开发过程中,建议:

  1. 统一编码:项目内尽量统一使用UTF-8编码
  2. 明确编码:读取文件时明确指定编码格式
  3. 错误处理:捕获UnsupportedEncodingException等编码相关异常
  4. 性能优化:使用缓冲流提高读写效率

抱歉,评论功能暂时关闭!