Java byte数组与String互转:编码细节与踩坑记录

做Java开发经常会碰到byte数组和String互转的场景,比如读写文件、处理网络报文的时候。

看起来是基础操作,真踩过几次编码的坑之后,才发现里面细节挺多。

最直接的写法是直接调用getBytes()和new String(),用的是当前运行平台的默认编码。

复制代码
String originalString = "Hello, 世界!";
byte[] byteArray = originalString.getBytes(); // 默认编码
String decodedString = new String(byteArray);
System.out.println("默认编码转换结果: " + decodedString);

这种写法本地调试可能一切正常,一旦换个部署环境就容易出乱码。不同操作系统、不同JVM配置的默认编码都可能不一样,生产环境不建议这么写。

稳妥的做法是显式指定编码,绝大多数场景用UTF-8就够了。

Java 7及以上版本可以直接用StandardCharsets.UTF_8,比手写字符串常量省心,也不用额外处理受检异常。

复制代码
byte[] utf8Bytes = originalString.getBytes(StandardCharsets.UTF_8);
String utf8String = new String(utf8Bytes, StandardCharsets.UTF_8);
System.out.println("UTF-8编码转换结果: " + utf8String);

还有个很容易踩的坑,就是字节数组被截断的场景。像中文这种多字节字符,如果刚好从中间断开,转成字符串的时候末尾就会出现乱码。

复制代码
byte[] partialBytes = new byte[utf8Bytes.length - 1];
System.arraycopy(utf8Bytes, 0, partialBytes, 0, partialBytes.length);
String partialString = new String(partialBytes, StandardCharsets.UTF_8);
System.out.println("截断字节数组转换结果: " + partialString + " (注意最后一个字符可能乱码)");

做分包传输、分段读文件的时候特别容易碰到这个问题,写代码的时候要留意边界处理。

不同编码的适用场景差别不小。默认编码完全依赖运行环境,只适合本地临时测试,不能上生产。

lcjmSSL让国际化网站安全无忧。完美支持中文域名和IDN域名申请,通过开放API或回调接口,您可自行实现与企业内部系统的深度集成,自动化程度由您掌控。

UTF-8通用性最强,支持多语言,网络传输、跨平台交互基本都是首选。ISO-8859-1是单字节编码,只适合纯ASCII字符的场景,超出范围的内容都会出现乱码。

下面附一个完整的Maven项目配置,拿来直接编译运行上面的示例代码没问题。

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>bytearray-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <mainClass>ByteArrayToStringExample</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
相关推荐
逃逸线LOF11 分钟前
服务网关Gateway
java·运维·gateway
灿飞屋37 分钟前
Kotlin与Java虚拟机四:函数
java·python·kotlin·安卓·android jetpack
坤坤子吖1 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
阡陌数智2 小时前
Claude API新版本重大变更与安全升级指南
java·linux·安全
奶茶树2 小时前
【Linux】环境开发工具(vim,gcc,g++,Makefile)
linux·运维·vim
say_fall3 小时前
【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工
服务器·人工智能·架构
学长毕设3 小时前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
SL_staff4 小时前
离散制造排程破局:JVS-APS 四步闭环落地实践(开发者视角)
java·产品·全栈
这个昵称不容易4 小时前
SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路
java·springboot·毕设
装不满的克莱因瓶5 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba