当前位置: 代码迷 >> J2SE >> 代码错误
  详细解决方案

代码错误

热度:51   发布时间:2016-04-23 20:40:43.0
代码异常
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了就抛出了异常
------解决方案--------------------
引用:
Quote: 引用:

调用flip方法的时候会重置limit将limit的值设置为当前position然后将其重置
循环的时候发现大于limit了就抛出了异常

我调的是CharBuffer chbuf的filp,不是调的Bytebuffer bbuf的flip
for循环里是bbuf.capacity()

在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;
  相关解决方案