可以使用編碼方案將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