A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ifinver 中级黑马   /  2014-10-11 09:53  /  1144 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

RandomAccessFile类是同时具备读写功能的随机访问文件的类,实现了DataInput接口和DataOutput接口,封装了文件指针,类似c++的File类,可以对任意位置上的字节进行增删改查操作。 我用每20个字节存一个人的信息(姓名和年龄),前16位存姓名,后4位存年龄比如存三个字的姓名时,三个汉字6个字节,整数4字节,所以存储的结果是:0-5字节位上是姓名,6-15字节位没操作过,16-19字节位上是整数。 问题是这样,我取数据的时候,由于不知道这个人的名字是几个汉字,所以就不知道占几个字节,所以只能把0-15字节位上的字节转换成字符串,然而转换后的字符串有乱码,像这样:

请问怎么解决啊。。。

贴下代码。
存储的代码如下
  1.         public static void Write(RandomAccessFile raf) throws IOException{
  2.                 String[] names = {"张小三","李小四","王五"};
  3.                 for(int i = 0;i < names.length;i++){
  4.                         //每20个字节存一个人信息,跳到第i个20字节的位置上写第i个人
  5.                         raf.seek(20*i);
  6.                         //在0-16字节上写入姓名,
  7.                         raf.write(names[i].getBytes());
  8.                         //指针跳到第17个字节上写年龄
  9.                         raf.seek(20*i+16);
  10.                         raf.writeInt(30);//假设都是30岁
  11.                         //问题大约出在这,三个字是6个字节,
  12.                         //所以0-5字节上是姓名,6-15字节上没写过数据,16-19字节上是一个整数
  13.                 }               
  14.         }
复制代码

读取的代码:
  1. public static void Read(RandomAccessFile raf) throws IOException{
  2.                 int count  = 3;       
  3.                 byte[] name = new byte[16];
  4.                 for(int i = 0;i < count;i++){
  5.                         raf.seek(20*i);
  6.                         //读取前16位
  7.                         int len = raf.read(name);
  8.                         //将前16位字节转成字符串
  9.                         String str = new String(name,0,len);
  10.                         System.out.println(str);
  11.                         //读取后4位的整数
  12.                         raf.seek(20*i+16);
  13.                         System.out.println(raf.readInt());
  14.                 }       
复制代码
主函数
  1. public static void main(String[] args) throws IOException {
  2.                 RandomAccessFile raf = new RandomAccessFile("D:\\a.txt","rw");
  3.                 Write(raf);
  4.                 Read(raf);
  5.                
  6.                 raf.close();
  7.                
  8.         }
复制代码






评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

2 个回复

倒序浏览
本帖最后由 水竹 于 2014-10-11 10:49 编辑


不知你在哪里看到的乱码,反正我在控制台输出没问题。
实在不想看到乱码的话,String类有个trim方法可以去除字符串首尾空格(空白,写错了):
public String trim()返回字符串的副本,忽略前导空白和尾部空白。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
水竹 发表于 2014-10-11 10:47
不知你在哪里看到的乱码,反正我在控制台输出没问题。
实在不想看到乱码的话,String类有个trim方法可以去 ...

啊 谢谢 你不提醒都忘了trim()了。。
我在Eclipse里面看到的乱码。。我也在cmd控制台试了下,果然没乱码。。。。
0.0
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马