在Java中,将String转换为byte[](字节数组)是一个常见操作,但需要注意字符编码(如UTF-8、GBK等)的影响,以下是几种常见的方法和示例:

使用 `String.getBytes()(默认编码)
String str = "Hello, 世界"; byte[] bytes = str.getBytes(); // 使用JVM默认的字符编码(可能因环境而异)
注意:如果JVM的默认编码与字符串的实际编码不一致,会导致乱码,建议显式指定编码。
使用 `String.getBytes(StandardCharsets.UTF_8)(推荐)
import java.nio.charset.StandardCharsets; String str = "Hello, 世界"; byte[] bytes = str.getBytes(StandardCharsets.UTF_8); // 显式指定UTF-8编码
优点:StandardCharsets是Java 7引入的枚举类,线程安全且性能高效。
使用 `String.getBytes(String charsetName)
String str = "Hello, 世界";
try {
byte[] bytes = str.getBytes("UTF-8"); // 指定编码名称(需处理异常)
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
注意:需要捕获UnsupportedEncodingException异常(但UTF-8通常被支持)。
处理特定场景(如ISO-8859-1)
String str = "Hello, 世界";
byte[] bytes = str.getBytes("ISO-8859-1"); // 仅适用于ASCII字符,非ASCII字符会丢失
适用场景:某些旧系统或协议要求使用ISO-8859-1编码。

从字节数组恢复为String
byte[] bytes = "Hello, 世界".getBytes(StandardCharsets.UTF_8); String str = new String(bytes, StandardCharsets.UTF_8); // 使用相同编码解码
关键点:编码和解码必须使用相同的字符集,否则会出现乱码。
常见问题
Q: 为什么会出现乱码?
A: 如果编码和解码的字符集不一致(例如编码用UTF-8,解码用GBK),会导致字节序列解析错误。
Q: 如何检查字符串的编码?
A: Java的String本身不存储编码信息,编码取决于转换时使用的字符集。
Q: 如何处理超大字符串?
A: 对于超大字符串,建议使用流式处理(如InputStreamReader)避免内存溢出。

完整示例
import java.nio.charset.StandardCharsets;
public class StringToByteExample {
public static void main(String[] args) {
String str = "Hello, 世界";
// 方法1:推荐(UTF-8)
byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8);
System.out.println("UTF-8 Bytes: " + java.util.Arrays.toString(utf8Bytes));
// 方法2:指定编码名称
try {
byte[] gbkBytes = str.getBytes("GBK");
System.out.println("GBK Bytes: " + java.util.Arrays.toString(gbkBytes));
} catch (Exception e) {
e.printStackTrace();
}
// 解码示例
String decodedStr = new String(utf8Bytes, StandardCharsets.UTF_8);
System.out.println("Decoded String: " + decodedStr);
}
}
- 优先使用
StandardCharsets.UTF_8,避免依赖JVM默认编码。 - 编码和解码必须使用相同的字符集。
- 避免使用未指定编码的
getBytes()方法,除非你确定环境编码。
