CharBufferクラス符号化に関する問題

2392 ワード

CharBufferはjavaです.nioの下の文字キャッシュクラスは、一般的には使えません.普段はByteBufferで代用しています.
 
暇な時、研究してみると、CharBufferは符号化変換に奇妙な問題があることが分かった.
 
 
CharBufferオブジェクトを取得する方法は
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
 
byteBuffer.put(「テスト文字aabc」.getBytes();
 
 
byteBuffer.asCharBuffer();
CharBuffer charBuffer=CharBuffer.wrap();
CharBuffer charBuffer=CharBuffer.allocate();
 
エラーの使用:
ByteBufferを文字列に変換して、直接次の方法で変換できると考えられています.
 
byteBuffer.asCharBuffer().toString();
 
これは間違いです.(byteBufferに格納されているバイトがutf-16 beでない限り、正常に出力できます)
 
byteBufferに格納されているバイトがutf-16 beでない場合、asCharBufferメソッドでCharBufferに変換した後、どのように正しく出力されますか.
 
テストコードは次のとおりです.
package com.cgb.train.core.nio;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;

public class CharBufferTest2 {

	/**
	 * @param args
	 * @throws UnsupportedEncodingException 
	 */
	public static void main(String[] args) throws UnsupportedEncodingException {
		// TODO Auto-generated method stub
		
		String s=" abc";
		ByteBuffer byteBuffer1=ByteBuffer.allocate(50);
		ByteBuffer byteBuffer2=ByteBuffer.allocate(50);
		
		byteBuffer1.put(s.getBytes("UTF-16BE"));// utf-16be 
		byteBuffer1.flip();// put ,position 。 。
		byteBuffer2.put(s.getBytes());// 
		byteBuffer2.flip();
		
		System.out.println(byteBuffer1.asCharBuffer().toString());
		/**
		 *  
		 */
		System.out.println(byteBuffer2.asCharBuffer().toString());
		/**
		 *  , 。
		 * 
		 * ByteBuffer.wrap(s.getBytes , flip, 。
		 * 
		 */
		System.out.println(ByteBuffer.wrap(s.getBytes("UTF-16BE")).asCharBuffer().toString());
	}

}

 
 
したがって、ByteBufferにUTF-16 BE符号化されたバイトを格納する場合、asCharBuffer()を直接使用して文字バッファに変換することができる.
 
では、UTF-16 BEコードを格納していないByteBufferについては、
CharBuffer charBuffer=Charset.forName(「文字コード」).decode(byteBuffer)が変換されます.
 
注意事項:
1、ByteBufferバイトバッファのビューバッファ例えばCharBuffer、IntBuffer、LongBuffer等を操作して位置変化を引き起こす場合、下位のByteBufferの位置(position,limit,mark等)は変化しない.
2、インデックスパラメータ付きのデータput(index)の追加とデータget(index)の取得方法がいくつかあることに注意してください.位置は変わりません.