我从一个文件中,读数据出来,数据是String型。
我的做法是首先读一个byte的字符串strchars.然后再把strchar转换成要输出的字符串。我用了两种方法。发现了出现以下不同。
如果说我直接用a=String(strchars)来取,在用System.out.print(a)。发现打印在控制台的字母,每个字母都要占两个字符的位置。
但是如果我用 a= ByteBuffer.wrap(strchars).asCharBuffer().toString()来取,然后再在控制台打印,每个字母就占一个字符的位置。
想请教一下,这有什么说法么?
我的做法是首先读一个byte的字符串strchars.然后再把strchar转换成要输出的字符串。我用了两种方法。发现了出现以下不同。
如果说我直接用a=String(strchars)来取,在用System.out.print(a)。发现打印在控制台的字母,每个字母都要占两个字符的位置。
但是如果我用 a= ByteBuffer.wrap(strchars).asCharBuffer().toString()来取,然后再在控制台打印,每个字母就占一个字符的位置。
想请教一下,这有什么说法么?
buf = ByteBuffer.allocate(1024);
buf.get(strchars); //取得byte数组
Stringdata = ByteBuffer.wrap(strchars).asCharBuffer().toString();
System.out.print(Stringdate).
这种情况下打印的是正常的。比方说Stringdata= "aa" ,那么打印的就是aa
ByteBuffer buf;
buf = ByteBuffer.allocate(1024);
buf.get(strchars); //取得byte数组
Stringdata = String(strchars);
System.out.print(Stringdate).
这种情况下,打印出来的是就是每个a都占两个自己的位置
asCharBuffer()
public abstract CharBuffer asCharBuffer()创建此字节缓冲区的视图,作为 char 缓冲区。
新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数的二分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。
在java中字符占用两个字节
不过再看了楼上的解释之后,我产生了一个问题。
CharBuffer,和ByteBuffer中一个字节占的bit位是不是一样的?
因为如果一样,数据是死的。比方说16bit。那么在bytebuffer里面就是2个字节。而Charbuffer里面如果也是一个8bit一个字节的话,那么转化之后,就会有8bit字节的损失。
但是我不知道这样理解对不对。
就像int类型在不同系统中有区别一样
char类型只需8位就足够,至于8bit的损失好像是有!呵呵
不知道这有什么其他解释么?