可以使用编码方案将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