Bootstrap

第一百七十四节 Java IO教程 - Java字符集

Java IO教程 - Java字符集

我们可以使用编码方案将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();
  }
}

上面的代码生成以下结果。


 

;