RandomAccessFile类是同时具备读写功能的随机访问文件的类,实现了DataInput接口和DataOutput接口,封装了文件指针,类似c++的File类,可以对任意位置上的字节进行增删改查操作。 我用每20个字节存一个人的信息(姓名和年龄),前16位存姓名,后4位存年龄比如存三个字的姓名时,三个汉字6个字节,整数4字节,所以存储的结果是:0-5字节位上是姓名,6-15字节位没操作过,16-19字节位上是整数。 问题是这样,我取数据的时候,由于不知道这个人的名字是几个汉字,所以就不知道占几个字节,所以只能把0-15字节位上的字节转换成字符串,然而转换后的字符串有乱码,像这样:
请问怎么解决啊。。。
贴下代码。
存储的代码如下- public static void Write(RandomAccessFile raf) throws IOException{
- String[] names = {"张小三","李小四","王五"};
- for(int i = 0;i < names.length;i++){
- //每20个字节存一个人信息,跳到第i个20字节的位置上写第i个人
- raf.seek(20*i);
- //在0-16字节上写入姓名,
- raf.write(names[i].getBytes());
- //指针跳到第17个字节上写年龄
- raf.seek(20*i+16);
- raf.writeInt(30);//假设都是30岁
- //问题大约出在这,三个字是6个字节,
- //所以0-5字节上是姓名,6-15字节上没写过数据,16-19字节上是一个整数
- }
- }
复制代码
读取的代码:
- public static void Read(RandomAccessFile raf) throws IOException{
- int count = 3;
- byte[] name = new byte[16];
- for(int i = 0;i < count;i++){
- raf.seek(20*i);
- //读取前16位
- int len = raf.read(name);
- //将前16位字节转成字符串
- String str = new String(name,0,len);
- System.out.println(str);
- //读取后4位的整数
- raf.seek(20*i+16);
- System.out.println(raf.readInt());
- }
复制代码 主函数
- public static void main(String[] args) throws IOException {
- RandomAccessFile raf = new RandomAccessFile("D:\\a.txt","rw");
- Write(raf);
- Read(raf);
-
- raf.close();
-
- }
复制代码
|