可以使用编码方案将Unicode
字符转换为字节序列,反之亦然。java.nio.charset
包提供了将CharBuffer
编码/解码为ByteBuffer
类,反之亦然。
Charset
类的对象表示编码方案。CharsetEncoder
类执行编码。CharsetDecoder
类执行解码。可以通过传递字符集的名称作为它的参数,使用它的forName()
方法获得Charset
类的对象。
对于简单的编码和解码任务,可以使用Charset
类的encode()
和decode()
方法。
以下代码显示如何对存储在字符缓冲区中的字符串Hello
中的字符序列进行编码,并使用UTF-8
编码方案对其进行解码。
Charset cs = Charset.forName("UTF-8");
CharBuffer cb = CharBuffer.wrap("Hello");
ByteBuffer encodedData = cs.encode(cb);
CharBuffer decodedData = cs.decode(encodedData);
CharsetEncoder
和CharsetDecoder
类接受要编码或解码的输入块。Charset
类的encode()
和decode()
方法将编码和解码的缓冲区返回。
以下代码显示如何从Charset
对象获取编码器和解码器对象。
Charset cs = Charset.forName("UTF-8");
CharsetEncoder encoder = cs.newEncoder();
CharsetDecoder decoder = cs.newDecoder();
以下代码演示如何列出JVM支持的所有字符集。
import java.util.Map;
import java.nio.charset.Charset;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map<String, Charset> map = Charset.availableCharsets();
Set<String> keys = map.keySet();
System.out.println("Available Character Set Count: " + keys.size());
for (String charsetName : keys) {
System.out.println(charsetName);
}
}
}
字节顺序
字节顺序仅在存储在字节缓冲器中的多字节值中有用。 要知道机器的字节顺序,请使用ByteOrder
类的nativeOrder()
方法。
import java.nio.ByteOrder;
public class Main {
public static void main(String args[]) {
ByteOrder b = ByteOrder.nativeOrder();
if (b.equals(ByteOrder.BIG_ENDIAN)) {
System.out.println("Big endian");
} else {
System.out.println("Little endian");
}
}
}
以下代码演示如何获取和设置字节缓冲区的字节顺序。使用ByteBuffer
类对象的order()
方法来获取或设置字节顺序。
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class Main {
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.allocate(2);
System.out.println("Default Byte Order: " + bb.order());
bb.putShort((short) 300);
bb.flip();
showByteOrder(bb);
bb.clear();
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.putShort((short) 300);
bb.flip();
showByteOrder(bb);
}
public static void showByteOrder(ByteBuffer bb) {
System.out.println("Byte Order: " + bb.order());
while (bb.hasRemaining()) {
System.out.print(bb.get() + " ");
}
System.out.println();
}
}
上面的代码生成以下结果。
Default Byte Order: BIG_ENDIAN
Byte Order: BIG_ENDIAN
1 44
Byte Order: LITTLE_ENDIAN
44 1