1. 概述

本文简明扼要地介绍如何使用 原生 JavaGuavaCommons IO 三种方式,将 byte[] 转换为 Writer

这类操作在实际开发中虽然不常见,但在处理 IO 流转换、中间缓冲或框架封装时可能会踩到这个坑。掌握几种实现方式,能让你在不同场景下灵活应对。


2. 使用原生 Java

最简单直接的方式是通过 String 作为中间桥梁,将字节数组先转为字符串,再写入 StringWriter

✅ 优点:无需第三方依赖,简单粗暴
❌ 缺点:多一次 String 对象创建,对大数组不友好

@Test
public void givenPlainJava_whenConvertingByteArrayIntoWriter_thenCorrect() 
  throws IOException {
    byte[] initialArray = "With Java".getBytes();
    Writer targetWriter = new StringWriter().append(new String(initialArray));

    targetWriter.close();
    
    assertEquals("With Java", targetWriter.toString());
}

⚠️ 注意:

  • getBytes() 使用的是平台默认字符集,生产环境建议显式指定(如 StandardCharsets.UTF_8
  • 转换过程会创建临时 String 对象,大文件场景慎用

3. 使用 Guava

Guava 提供了更灵活的 CharSink 抽象,适合需要扩展写入逻辑的场景。

✅ 优点:API 设计优雅,便于封装复用
❌ 缺点:引入 Guava 依赖,适合已有 Guava 的项目

@Test
public void givenUsingGuava_whenConvertingByteArrayIntoWriter_thenCorrect() 
  throws IOException {
    byte[] initialArray = "With Guava".getBytes();

    String buffer = new String(initialArray);
    StringWriter stringWriter = new StringWriter();
    CharSink charSink = new CharSink() {
        @Override
        public Writer openStream() throws IOException {
            return stringWriter;
        }
    };
    charSink.write(buffer);

    stringWriter.close();

    assertEquals("With Guava", stringWriter.toString());
}

💡 小技巧:

  • CharSink 是 Guava 中用于字符输出的抽象,类似 ByteSink 之于字节
  • 可以封装成工具类,支持不同 Writer 实现(如文件、网络等)

4. 使用 Commons IO

Apache Commons IO 提供了 StringBuilderWriter,直接基于 StringBuilder 构建 Writer,性能较好。

✅ 优点:轻量、高效,适合字符串为主的场景
❌ 缺点:仍需将 byte[] 转为 String,本质仍是内存中字符串操作

@Test
public void givenUsingCommonsIO_whenConvertingByteArrayIntoWriter_thenCorrect() 
  throws IOException {
    byte[] initialArray = "With Commons IO".getBytes();
    
    Writer targetWriter = new StringBuilderWriter(
      new StringBuilder(new String(initialArray)));

    targetWriter.close();

    assertEquals("With Commons IO", targetWriter.toString());
}

📌 提示:

  • StringBuilderWriter 是 Commons IO 特有类,不在 JDK 中
  • 若项目已引入 commons-io:commons-io,可直接使用

5. 总结

方式 是否需要依赖 推荐场景
原生 Java 简单场景,避免引入额外依赖
Guava 已使用 Guava,需扩展性与统一 API 风格
Commons IO 已使用 Commons IO,追求简洁写法

📌 核心要点:

  • 所有方式都绕不开 byte[] → String 的转换,本质是字符解码过程
  • 字符集问题务必显式指定,避免跨平台乱码
  • 大数据量场景建议直接使用 OutputStream,避免内存溢出

示例代码已托管至 GitHub:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-io-conversions


原始标题:Java - Byte Array to Writer