import java.nio.*;
//import java.util.*;public class UsingBuffers
{
public static void changePos(CharBuffer cb)
{
while(cb.hasRemaining())
{
cb.();
char c1=cb.get();
char c2=cb.get();
cb.reset();
cb.put(c2).put(c1);
}
}
public static void main(String[] args)
{
//ByteBuffer buf=ByteBuffer.allocate(1024);
CharBuffer cb=CharBuffer.wrap("ababab");
//cb.put("ababab");
changePos((CharBuffer)cb.rewind());
System.out.println((CharBuffer)cb.rewind());
}
}
调用该static方法就会抛出异常,不调用则不会,这是怎么回事啊?

解决方案 »

  1.   

    因为传入的CharBuffer是ReadOnly的,不能被put
      

  2.   

    那为什么这样就可以呢?
    ByteBuffer buf=ByteBuffer.allocate(1024);
    CharBuffer cb=buf.asCharBuffer();
    cb.put("fsdfd");
    将cb传给函数不会有异常抛出。
      

  3.   

    asCharBuffer
    public abstract CharBuffer asCharBuffer()
    Creates a view of this byte buffer as a char buffer. 
    The content of the new buffer will start at this buffer's current position. Changes to this buffer's content will be visible in the new buffer, and vice versa; the two buffers' position, limit, and  values will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided by two, and its  will be undefined. The new buffer will be direct if, and only if, this buffer is direct, and it will be read-only if, and only if, this buffer is read-only. 
    Returns:
    A new char buffer看最后一句:and it will be read-only if, and only if, this buffer is read-only. 
    由此看来,这样申请的ByteBuffer buf=ByteBuffer.allocate(1024);
    ByteBuffer是可以write的
    lz可以用这个方法审查 
    isReadOnly()