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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王梁星 中级黑马   /  2012-10-11 20:27  /  2424 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 缘木求鱼 于 2012-10-11 20:29 编辑
  1. //RandomAccessFileDemo?!.java
  2. /**
  3. * 一个员工信息就是文件中的一条记录,
  4. * 而且必须保证每条记录在文件中的大小相同,也就是每个员工的姓名字段在文件中的
  5. * 长度是一样的,
  6. * 这样才能够准确定位每条记录在文件中的具体位置。
  7. * 假设 name 中有 8
  8. * 个字符,少于 8 个则补空格(这里用"\u0000"),多于 8 个则去掉后面多余的部分。由于
  9. * 年龄是整型数,不管这个数有多大,只要它不超过整型数的范围,在内存中都是占 4
  10. * 个字节大小。
  11. */
  12. import java.io.*;
  13. public class RandomAccessFileDemo{
  14.   public static void main(String[] args)throws Exception{
  15.     Employee e1=new Employee("zhang",25);
  16.     Employee e2=new Employee("lisii",29);
  17.     Employee e3=new Employee("wangw",30);
  18.     RandomAccessFile ra=new RandomAccessFile("ra","rw");//打开一个文件以写入数据
  19.     ra.write(e1.name.getBytes());
  20.     ra.writeInt(e1.age);
  21.     ra.write(e2.name.getBytes());
  22.     ra.writeInt(e2.age);
  23.     ra.write(e3.name.getBytes());
  24.     ra.writeInt(e3.age);
  25.     ra.close();
  26.     RandomAccessFile raf =new RandomAccessFile("ra","r");//打开一个文件以读取数据
  27.     int len=8;
  28.     raf.skipBytes(12);// 跳过第一个员工的信息,其姓名 8 字节,年龄 4 字节
  29.     System.out.println("第二个员工信息:");
  30.     String str="";
  31.     for(int i=0;i<len;i++)
  32.         str=str+(char)raf.readByte();
  33.     System.out.println("name:"+str);
  34.     System.out.println("age:"+raf.readInt());
  35.     System.out.println("第一个员工信息:");
  36.     raf.seek(0);// 将文件指针移动到文件开始位置?//只是将文件指针指向开头
  37.     str="";
  38.     for(int i=0;i<len;i++)
  39.         str=str+(char)raf.readByte();
  40.     System.out.println("name:"+str);
  41.     System.out.println("age:"+raf.readInt());
  42.     System.out.println("第三个员工信息:");
  43.     raf.skipBytes(12);// 跳过第二个员工信息?,承接上次skipBytes的量,向左移
  44.     str="";
  45.     for(int i=0;i<len;i++)
  46.         str=str+(char)raf.readByte();
  47.     System.out.println("name:"+str.trim());//此字符串移除了前导和尾部空白的副本;如果没有前导和尾部空白,则返回此字符串
  48.     System.out.println("age:"+raf.readInt());
  49.     raf.close();
  50.   }
  51. }
  52. class Employee{
  53.   String name;
  54.   int age;
  55.   final static int LEN=8;
  56.   public Employee(String name,int age){
  57.     if(name.length()>LEN){
  58.         name=name.substring(0,8);
  59.     }
  60.     else
  61.     {        
  62.         while(name.length()<LEN)
  63.           name=name+"\u0008";
  64.     }
  65.     this.name=name;
  66.     this.age=age;
  67.   }
  68. }

  69. 我的上个问题没人解决,就来新问题了,大家看:
  70. --这是JAVA源程序所有内容。
  71. 解释下28、36、43三个语句的原理。
  72. 谢谢了
复制代码

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
  28行  raf.skipBytes(12);// 跳过第一个员工的信息,其姓名 8 字节,年龄 4 字节
---------------skipBytes方法时RandomAccessFile的一个方法,他是将读取指针正向偏移传入参数个字节。由于Emploree类的构造方法中对name字节长度的判断,超过八个只取八个字节,不到八个字节用一个特殊字节来填充。年龄为int值,所以是四个字节长度。所以要读取第二个人就应该正向偏移12个字节,此时指针是在第二个人信息的第一个字节上。


36行 raf.seek(0);// 将文件指针移动到文件开始位置?//只是将文件指针指向开头
----------------------------------------seek方法是将指针指定在参数位置上,指在零上也就是第一个人信息的第一个字节

43行raf.skipBytes(12);// 跳过第二个员工信息?,承接上次skipBytes的量,向左移
-------------------------------------------同一刚才读完第一个员工,要读第三个员工信息,就要把第二个员工的12个字节信息跳过


评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
郭阳 发表于 2012-10-11 21:58
28行  raf.skipBytes(12);// 跳过第一个员工的信息,其姓名 8 字节,年龄 4 字节
---------------skipBytes ...

36行的seek()方法,文件指针偏移到文件首,那么执行43行的skipByte()方法不该跳过第一和第二个员工信息,也就是跳24个字节吗?

麻烦讲下seek()方法。还有63行的name=name+"\u0008"
回复 使用道具 举报
36行指针偏移到文件首之后,不是又读了12个字节吗(38-41行。。。。。。。)?  这个时候指针又指在第二个人信息的第一个字节了,要想读第三个人就只需要把第二个人跳过去。。。。。。


name=name+"\u0008"就是把name填满8个字节。。。。。你是想问、\u0008吗 ?  他是一个unicode字节码。。。。占一个字节,你也可以换成"\u0007"或者"\u0009"

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
郭阳 发表于 2012-10-12 13:43
36行指针偏移到文件首之后,不是又读了12个字节吗(38-41行。。。。。。。)?  这个时候指针又指在第二个 ...

调用seek时,文件指针指向首字节,然后调用skipByte以读取第三个员工信息,不该跳24个字节吗?
----清详细讲讲这里
回复 使用道具 举报

回复 使用道具 举报
郭阳 发表于 2012-10-14 16:05

懂了,谢谢详解

无语什么,哪有问题了吗?
回复 使用道具 举报
郭阳 中级黑马 2012-10-14 20:13:34
8#
不客气

无语你的详解要如此之详你才能看懂

不知道是不是我表达能力不行。。。。。。
但是我自认为我第一次和第二次的回复已经表达的很清楚了
回复 使用道具 举报
郭阳 发表于 2012-10-14 20:13
不客气

无语你的详解要如此之详你才能看懂

:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马