黑马程序员技术交流社区

标题: 关于RandomAccessFile中skipByte方法的一个疑惑 [打印本页]

作者: HM许涛    时间: 2013-4-11 15:32
标题: 关于RandomAccessFile中skipByte方法的一个疑惑
本帖最后由 HM许涛 于 2013-4-11 19:23 编辑

程序源码出处:张孝祥老师JAVA就业培训教材 p242页7.2RandomAccessFile类例子
import java.io.*;
public class RandomFileTest
{
        public static void main(String[] args) throws Exception
        {
                Employee e1=new Employee("adadfadfafadfa",22);
                Employee e2=new Employee("bb",2211);
                Employee e3=new Employee("cccccccc",234);
                RandomAccessFile ra=new RandomAccessFile("d:\\1.txt","rw");
                ra.write(e1.name.getBytes());
                ra.writeInt(e1.age);
                                ra.write(e2.name.getBytes());
                ra.writeInt(e2.age);
                                ra.write(e3.name.getBytes());
                ra.writeInt(e3.age);
                ra.close();
                RandomAccessFile raf=new RandomAccessFile("d:\\1.txt","r");
                int len=8;
                raf.skipBytes(12);
                System.out.println("第二个员工的信息:");
                String str=" ";
                for(int i=0;i<len;i++)
                        str=str+(char)raf.readByte();
                System.out.println("name: "+str);
                System.out.println("age:"+raf.readInt());
                System.out.println("第一个员工的信息");
                raf.seek(0);
                str=" ";
                for(int i=0;i<len;i++)
                        str=str+(char)raf.readByte();
                System.out.println("name: "+str);
                System.out.println("age:"+raf.readInt());
                        System.out.println("第三个员工的信息");
                raf.skipBytes(12);
                str=" ";
                for(int i=0;i<len;i++)
                        str=str+(char)raf.readByte();
                System.out.println("name: "+str);
                System.out.println("age:"+raf.readInt());
                raf.close();
        }
}
class Employee
{
        String name;
        int age;
        final static int LEN=8;
        public Employee(String name,int age)
        {
                if(name.length()>LEN)
                {
                        name=name.substring(0,8);/*如果姓名字符串长度大于8,则取前八位———》public String substring(int beginIndex, int endIndex)
                                                                                返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,
                                                                                endIndex:到指定的 endIndex-1处结束。*/
                }
                else
                {
                        while(name.length()<LEN)
                                name=name+"\u0000";//如果小于8,则用0补位。
                }
                this.name=name;
                this.age=age;
        }
}
疑问:第一个skipBytes(12)跳过后,第二个raf.seek(0)将指针移动到文件开始位置,第三个raf.skipBytes(12);取第三个员工信息。这里为什么会还是跳过12?在seek(0)方法后,指针的位置在哪里?
作者: 熊永标    时间: 2013-4-11 16:37
  1. raf.skipBytes(12);
  2. System.out.println("第二个员工的信息:");
  3. String str=" ";
  4. for(int i=0;i<len;i++)
  5. str=str+(char)raf.readByte();
  6. System.out.println("name: "+str);
  7. System.out.println("age:"+raf.readInt());
复制代码
读到第二员工之后,
  1. raf.seek(0);
复制代码
此时指针到了文件开始处:
  1. str=" ";
  2. for(int i=0;i<len;i++)
  3. str=str+(char)raf.readByte();
  4. System.out.println("name: "+str);
  5. System.out.println("age:"+raf.readInt());
复制代码
读到了第一个员工,此时文件指针指向第二个员工信息的开始处:
  1. raf.skipBytes(12);
复制代码
此时文件指针在第二个员工的位置处加上12,此时指针指向了第三个员工
作者: 曹睿翔    时间: 2013-4-11 16:50
楼上说的是对的,RandomAccessFile   随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引(通过试验代码可知道一个实例只有一个指针),称为文件指针;
这样就不难理解,第一次是调用 raf.skipBytes(12);这时指针指向第二个员工信息开始处,
然后开始for(int i=0;i<len;i++)
                        str=str+(char)raf.readByte();
                System.out.println("name: "+str);
                System.out.println("age:"+raf.readInt());
循环八次readByte(),又readInt().共十二个字节.
然后又调用seek将指针指向流的头部.
又读了十二个字节.这时指针指向了第二个信息的头部(加上12个字节就指向了第三个员工信息的头部)
总结:记住只有一个指针在操作,
另外,通过源码可以知到skipBytes()调用seek()方法,而seek方法被native修饰(属于JNI,这个应该是调用了计算机底层的硬件),read(),readLine(0都是被Native修饰的
上面的方法在调用时,知道指针随着变化就行了

多谢,不是你我也不会去看源码,也不会知道JNI这个词,哈哈

作者: HM许涛    时间: 2013-4-11 19:22
熊永标 发表于 2013-4-11 16:37
读到第二员工之后,此时指针到了文件开始处:读到了第一个员工,此时文件指针指向第二个员工信息的开始处:此时 ...

感谢,懂了
作者: HM许涛    时间: 2013-4-11 19:23
曹睿翔 发表于 2013-4-11 16:50
楼上说的是对的,RandomAccessFile   随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指 ...

感谢回复,懂了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2