char[] input =new char[24];
for (int i=0; i<24; i++){
input[i] = (char)('a'+i);
}
RandomAccessFile bf = new RandomAccessFile("data1.txt", "rw");
for(int i=0; i<24; i++){
bf.writeChar(input[i]);
}
使用上面的代码,当我打开文件时,它似乎是&#34; abcd ...&#34;正如我所料,但当我尝试阅读文件时
RandomAccessFile rf1 = new RandomAccessFile("data1.txt", "r");
rf1.seek(0);
System.out.println(rf1.readChar());
rf1.seek(1);
System.out.println(rf1.readChar());
rf1.close();
它给出了一个&#39;正如所料,但在寻求(1)它给了我?而不是b,为什么?
答案 0 :(得分:1)
char是16位,即2个字节。您正在从第一个字符的中间读取,这会导致一个不可映射的unicode字符(转换为'?')。您想改为seek(2)
。
来自public final void writeChar(int v)
的javadoc:
将char作为双字节值写入文件,首先是高字节。该 write从文件指针的当前位置开始。
答案 1 :(得分:0)
RandomAccessFile
的{{1}}和readChar
方法读取/写入Unicode(2字节)代码点。
writeChar
方法将文件访问指针定位为以字节为单位的偏移量,因此seek
将读取指针放在Unicode“a”的第二个字节上,后面的seek(1)
检索从低位构造的Unicode字符“a”的字节和“b”的高字节