| 需求场景 | 推荐方法 | 示例代码 |
|---|---|---|
最常用、最推荐 (将 byte 视作字符的 ASCII 码) |
String.valueOf() 或 Character.toString() |
String s = String.valueOf((char)myByte); |
需要处理负数 (将 byte 转换为其十进制数字的字符串形式) |
Byte.toString() 或 String.valueOf() |
String s = Byte.toString(myByte); |
| 需要指定字符编码 (处理非 ASCII 字符,如中文) | new String(byte[], charset) |
String s = new String(new byte[]{myByte}, "UTF-8"); |
| 需要将字节数组转换为字符串 | new String(byte[], charset) |
String s = new String(myByteArray, "UTF-8"); |
最常见的情况:将 byte 视作一个字符
这是最普遍的需求,特别是当你处理网络协议、文件格式或二进制数据时,一个 byte 通常代表一个 ASCII 字符(65 代表 'A')。

关键点: Java 的 byte 是有符号的(-128 到 127),而 char 是无符号的(0 到 65535),直接转换时,必须先将 byte 提升为 char,否则负数会得到意想不到的结果。
使用 String.valueOf(char)
这是最清晰、最推荐的方法。
public class ByteToStringExample {
public static void main(String[] args) {
byte myByte = 65; // ASCII 码 65 对应字符 'A'
// 1. 推荐方法:先将 byte 转换为 char,再转为 String
String str1 = String.valueOf((char) myByte);
System.out.println("方法一结果: " + str1); // 输出: A
byte myByte2 = 97; // ASCII 码 97 对应字符 'a'
String str2 = String.valueOf((char) myByte2);
System.out.println("方法一结果: " + str2); // 输出: a
}
}
使用 Character.toString(char)
这个方法和方法一在功能上是完全等价的,只是写法不同。
byte myByte = 65;
String str = Character.toString((char) myByte);
System.out.println("方法二结果: " + str); // 输出: A
为什么需要先转 char?
让我们看看如果不转换会发生什么:

byte negativeByte = -128;
// 错误示范:直接将 byte 作为数字转 String
String wrongStr = String.valueOf(negativeByte);
System.out.println("错误示范: " + wrongStr); // 输出: -128
// 正确示范:将 byte 视作字符码
String correctStr = String.valueOf((char) negativeByte);
System.out.println("正确示范: " + correctStr); // 输出一个特殊字符,而不是 "-128"
-128 作为 byte 是一个负数,直接 String.valueOf() 会得到字符串 "-128"。
而 (char) -128 会进行类型转换,得到一个 char 值(在 UTF-16 中,它通常是一个控制字符或特殊符号),然后这个 char 被转换成单字符的字符串。
将 byte 视作一个数字(处理负数)
如果你的需求是获取 byte 的十进制数值的字符串表示(-128 就要变成 "-128"),那么应该使用 Byte 类的静态方法。
使用 Byte.toString(byte)
这是最直接的方法。
public class ByteToNumericStringExample {
public static void main(String[] args) {
byte positiveByte = 65;
byte negativeByte = -128;
String str1 = Byte.toString(positiveByte);
System.out.println("正数结果: " + str1); // 输出: 65
String str2 = Byte.toString(negativeByte);
System.out.println("负数结果: " + str2); // 输出: -128
}
}
使用 String.valueOf(byte)
这个方法在内部也是调用了 Byte.toString(),效果完全一样。

byte myByte = -128;
String str = String.valueOf(myByte);
System.out.println("结果: " + str); // 输出: -128
指定字符编码(处理多语言字符)
当 byte 或 byte[] 包含非 ASCII 字符(如中文、日文、表情符号等)时,必须指定正确的字符编码(Character Encoding),否则会出现乱码。
重要提示: 永远不要使用平台默认编码(new String(byte[]) 不带参数的构造方法),因为它会导致程序在不同操作系统(Windows 默认是 GBK,Linux/macOS 默认是 UTF-8)上产生不同的结果。
使用 new String(byte[], charset)
假设我们有一个中文字符 '中',它在 UTF-8 编码下占 3 个字节。
import java.nio.charset.StandardCharsets;
public class ByteToStringEncodingExample {
public static void main(String[] args) {
// '中' 字符在 UTF-8 编码下的字节数组
byte[] utf8Bytes = {(byte) 0xE4, (byte) 0xB8, (byte) 0xAD};
// 正确方式:明确指定使用 UTF-8 编码
String strFromUtf8 = new String(utf8Bytes, StandardCharsets.UTF_8);
System.out.println("使用 UTF-8 解码: " + strFromUtf8); // 输出: 中
// 错误示范:使用系统默认编码(例如在 Windows 上可能是 GBK)
// String strWrong = new String(utf8Bytes);
// System.out.println("使用默认编码解码(可能乱码): " + strWrong); // 可能输出乱码,如 "涓�"
// 如果用错误的编码(如 ISO-8859-1)去解码
String strWrongEncoding = new String(utf8Bytes, "ISO-8859-1");
System.out.println("使用 ISO-8859-1 解码(乱码): " + strWrongEncoding); // 输出乱码
}
}
如何选择 Charset?
StandardCharsets.UTF_8: 强烈推荐,这是目前互联网上最通用的编码,能表示全球几乎所有字符。StandardCharsets.ISO_8859_1: 也被称为 Latin-1,它只能表示西欧语言,一个重要的特性是,它是一种“无损耗”的编码,即一个字节对应一个字符,反之亦然,常用于在需要保证字节不变的场景下进行中间转换。"GBK","Big5": 用于处理特定地区的编码,如简体中文(GBK)、繁体中文(Big5)。
将整个字节数组转换为字符串
这是 byte 转 String 最实际的应用场景,例如从网络或文件中读取数据。
import java.nio.charset.StandardCharsets;
public class ByteArrayToStringExample {
public static void main(String[] args) {
// 一个包含 "Hello, 世界!" 的字节数组,使用 UTF-8 编码
byte[] byteArray = "Hello, 世界!".getBytes(StandardCharsets.UTF_8);
// 使用相同的编码将其转换回 String
String str = new String(byteArray, StandardCharsets.UTF_8);
System.out.println(str); // 输出: Hello, 世界!
}
}
总结与最佳实践
-
将
byte当作一个字符(如 ASCII 码)时:- 使用
String.valueOf((byte) myByte)是 错误 的,它会把负数变成带负号的字符串。 - 使用
String.valueOf((char) myByte)或Character.toString((char) myByte)是 正确且推荐 的。
- 使用
-
将
byte当作一个数字时:- 使用
Byte.toString(myByte)或String.valueOf(myByte)。
- 使用
-
处理文本数据(特别是多语言)时:
- 永远使用
new String(byte[], StandardCharsets.UTF_8)或new String(byte[], "UTF-8")。 - 避免使用不带
charset参数的new String(byte[])构造方法。
- 永远使用
-
处理字节数组时:
- 确保编码和解码使用的是 同一种字符编码,否则必然导致乱码。
StandardCharsets.UTF_8是最安全、最现代的选择。
- 确保编码和解码使用的是 同一种字符编码,否则必然导致乱码。
