package NewIO;
import java.nio.*;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class CharsetTransformTest {
public static void main(String[] args) throws CharacterCodingException {
// 创建简体中文对应的Charset
Charset cn = Charset.forName("GBK");
CharsetEncoder cnEncoder = cn.newEncoder();
CharsetDecoder cnDecoder = cn.newDecoder();
CharBuffer chbuf = CharBuffer.allocate(10);
chbuf.put('a');
chbuf.put('b');
chbuf.put('c');
chbuf.put('d');
chbuf.flip();
// 将CharBuffer中的字符序列转换成字节序列
ByteBuffer bbuf = cnEncoder.encode(chbuf);
System.out.println("bbuf.capacity():" + bbuf.capacity());
System.out.println("chbuf.capacity():" + chbuf.capacity());
// 循环访问每个字节
for (int i = 0; i < bbuf.capacity(); i++) {
System.out.println(bbuf.get(i) + "");
}
System.out.println("\n" + cnDecoder.decode(bbuf));
}
}
------解决方案--------------------
package NewIO;
import java.nio.*;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class CharsetTransformTest {
public static void main(String[] args) throws CharacterCodingException {
// 创建简体中文对应的Charset
Charset cn = Charset.forName("GBK");
CharsetEncoder cnEncoder = cn.newEncoder();
CharsetDecoder cnDecoder = cn.newDecoder();
CharBuffer chbuf = CharBuffer.allocate(10);
chbuf.put('a');
chbuf.put('b');
chbuf.put('c');
chbuf.put('d');
chbuf.flip();
// 将CharBuffer中的字符序列转换成字节序列
ByteBuffer bbuf = cnEncoder.encode(chbuf);
System.out.println("bbuf.capacity():" + bbuf.capacity());
System.out.println("chbuf.capacity():" + chbuf.capacity());
// 循环访问每个字节
for (int i = 0; i < bbuf.limit(); i++) {
System.out.println(bbuf.get(i) + "");
}
System.out.println("\n" + cnDecoder.decode(bbuf));
}
}
这样改就可以了
------解决方案--------------------
虽然我没有运行但是应该是索引异常吧,而且你的输出值应该是四个
因为
capacity 是字符串缓冲区的容量,你为chbuf 它 分配了四个缓冲区, 所以你当然只能输出四个啦,如果你再分配一个就会出现五个
------解决方案--------------------
调用flip方法的时候会重置limit将limit的值设置为当前position然后将其重置
循环的时候发现大于limit了就抛出了异常
------解决方案--------------------
在cnEncoder.encode(chbuf);调用时,会构造一个ByteBuffer out
这个out最后是会flip的
int n = (int)(in.remaining() * averageBytesPerChar());
ByteBuffer out = ByteBuffer.allocate(n);
if ((n == 0) && (in.remaining() == 0))
return out;
reset();
for (;;) {
CoderResult cr = in.hasRemaining() ?
encode(in, out, true) : CoderResult.UNDERFLOW;
if (cr.isUnderflow())
cr = flush(out);
if (cr.isUnderflow())
break;
if (cr.isOverflow()) {
n = 2*n + 1; // Ensure progress; n might be 0!
ByteBuffer o = ByteBuffer.allocate(n);
out.flip();
o.put(out);
out = o;
continue;
}
cr.throwException();
}
out.flip();
return out;