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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 南远松 注册黑马   /  2011-7-28 22:55  /  1967 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家可以看一下链接,因为这里不能发图片。http://blog.sina.com.cn/s/blog_735ae2580100vhtt.html
起初我不明白zhangsan变成张三后为什么程序会有变化;对于raf.readInt()方法,我不明白为什么zhangsan后面会是zhangsan对应的年龄。然后我查了查jdk文档,看到readInt()方法的介绍:“从此文件读取一个有符号的 32 位整数。此方法从该文件的当前文件指针开始读取 4 个字节。如果按顺序读取的字节为 b1、b2、b3 和 b4,其中 0 <= b1, b2, b3, b4 <= 255,则结果将等于:
(b1 << 24) | (b2 << 16) + (b3 << 8) + b4
在读取了这四个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。 ”
我突然明白了,这个RandomAccessFile类是个指针类,在读了zhangsan的名字之后,指针停留在zhangsan的年龄前面了,就会读zhangsan对应的年龄了。
而对于zhangsan变张三,我一开始宏观弄明白了,就是一个中文字符比一个英文字符,多占1字节,所以要*2,但是我仔细一研究,zhangsan是8个字符,张三却是两个字符,汉字张三*2,不就是4个字节吗?不应该放不下啊,请高人答解。

1 个回复

倒序浏览
黑马网友  发表于 2011-7-29 09:52:28
沙发
楼主啊,回答您的问题,首先得猜测,您到底想问什么。。
您是不是想问,为什么之后要,每次跳的字节数是:raf.skipBytes(Employees.LEN*2+4)?
如果是的,那么看看下面的解释。

范例1:您可能忽略了一个问题。[code=java]package org.cxy.demo;

public class Demo{
        public static void main(String[] args) {
                char ch = 'a';
                String str = "a";
                // 输出1。
                System.out.println(str.getBytes().length);
        }
}[/code]首先,咱们都知道字符‘a’是占一个字节,因此上面的程序,会输出1。
但是char ch = 'a';确是占据2个字节。因为Java使用Unicode编码。所有的字符型变量的长度,都占2个字节。
换句话说,字符'a'本质上是占据1个字节的,但是当在Java中使用char变量存储的时候,会为字符'a',分配2个字节。

RandomAccessFile类,的writeChars()方法,是以字符的形式,将数据写入目的地。
换句话说,这个方法写出的每个字符,都是占据2个字节的,而不论这个字符是汉字,亦或是英文字母。
因此,“张三      ”在磁盘上占据的是16个字节。
而readChar方法,也同样是以字符的方式来读的,每次读取2个字节。因此程序中循环读了8次后,用了一个trim方法。

最主要的是(注意,BOSS来了)raf.skipBytes()方法,是[color=Red]以字节为单位[/color]进行跳转的,
因此跳转一个人的信息时,需要跳转raf.skipBytes(Employees.LEN*2+4) ,也就是说,字符的个数*2+4个字节数。


最后,力顶研究RandomAccessFile类的童鞋。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马