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]);
}
使用上面的代码,当我打开文件时,它似乎是"abcd…",正如我所期望的,但当我尝试读取文件时
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();
它给出了预期的"a",但当搜索(1(时,它给出了我?而不是b,为什么?
字符是16位,即2个字节。您正在从第一个字符的中间读取,这将导致一个不可映射的unicode字符(翻译为"?"(。您想改为执行seek(2)
。
来自public final void writeChar(int v)
:的javadoc
将一个字符以两字节值的形式写入文件,高位字节优先。这个写入从文件指针的当前位置开始。
RandomAccessFile
的readChar
和writeChar
方法读取/写入Unicode(2字节(代码点。
seek
方法将文件访问指针定位为以字节为单位的偏移量,因此seek(1)
将读取指针放置在Unicode"a"的第二个字节上,随后的readChar
检索由的低字节"a"和高字节"b"构成的Unicode字符