注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

liangxh2008的博客

 
 
 

日志

 
 

IO:RandomAccessFile类  

2010-06-10 09:12:06|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://www.c log.cn//36711/showart_479518.html

RandomAccessFile类:

RandomAccessFile类可以说是java语言中功能最丰富的文件访问类,它提供了众多的文件访问方法。
RandomAccessFile 类支持随机访问方式,也就是可以跳转到文件的任意位置开始读写数据,RandomAccessFile实例对象中有个指示器(有点像指针),它可以跳转到 文件的任意位置,RandomAccessFile的读写操作都是从指示器所指示的当前位置开始读写,当读写N个字节以后,文件指示器将指向N个字节后的 下一个字节处。刚打开文件的时候,指示器是指向文件的开头处,文件指示器移动到新的位置以后,随后的读写操作就会从新的位置开始。如果不想以从头到尾的方 式来读写文件,使用RandomAccessFile类就是一个很好的选择。比如在网上下载资料的断点续传功能就是用的这种方法。

RandomAccessFile 类在随机读取等长记录格式的文件时有很大的优势。记录格式的文件就是文件里面存储的信息是一条条的记录,比如像一条条员工的信息,一条条学生的成绩。等长 记录就是要求每一条记录信息的内容长度一样,在一条记录中就可以若干的字段,比如员工信息里面包括姓名,年龄等。如果记录的长度是相等的,那么就可以很容 易定位到第N个记录(第N个员工)的记录处开始读取数据。

RandomAccessFile类仅限于操作文件,不能访问其它的IO设备, 如网络等。在创建RandomAccessFile实例对象的时候,可以传递给构造函数的参数来指定文件是以只读的方式还是以读写的方式打开,如果以只读 的方式打开,那就不能够向文件中写入数据。
两种构造方法:
new RandomAccessFile(f."w");//读写方式
new RandomAccessFile(f."r");//只读方式

下面来看一个例子:往文件中写入三名员工的信息,每个员工含有姓名和年龄两个字段,然后按照第二名,第一名,第三名的先后顺序读出员工信息。

先定义一个Employee类:

p lic class Employee {
    p lic String name = null;
    p lic int age = 0;
    p lic static final int LEN = 8;
    p lic Employee(String name,int age)
    {
        if(name.length()>LEN) //如果姓名大于8个
        {
            this.name = name.s string(0,LEN);//截取前8位
        }
        else //如果姓名小于8个
        {
            while(name.length()<LEN) //填充空格到8个
            {
                name += "\"; //空格的Unicode码是\
            }
        }
        this.name = name;
        this.age = age;
    }
}


再定义运行类:
import java.io.*;
p lic class RandomFileTest {

    p lic static void main(String[] args) throws Exception{
        Employee e1 = new Employee("zhenzhen",18);
        Employee e2 = new Employee("kaikai",20);
        Employee e3 = new Employee("g ng n",17);
        
        RandomAccessFile ra = new RandomAccessFile("employee.txt","rw");//将信息写入文件

        ra.writeChars(e1.name);//writeChars()方法的参数可以是String类型,也就是可以字符串写入

        ra.writeInt(e1.age);
        ra.writeChars(e2.name);
        ra.writeInt(e2.age);
        ra.writeChars(e3.name);
        ra.writeInt(e3.age);
        ra.close();
        
        String strName = "";
        RandomAccessFile raf = new RandomAccessFile("employee.txt","r");//从文件读信息

        /************第2个员工的信息************/        
        raf.skipBytes(Employee.LEN*2+4);
        for(int i=0;i<Employee.LEN;i++)//for循环读取字符

        {
            strName += raf.readChar();//readChar(),只能一个一个字符读,而写信息就可以用字符串的方式,参照writeChars()方法

        }
        System.out.println(strName.trim()+":"+raf.readInt());//String的trim()可以减去多余的空格

        strName = "";//清空字符串变量

        /************第1个员工的信息************/    
        raf.seek(0);//读取第一个员工的信息需要将文件指示器跳转到文件开始处,seek()为绝对跳转,skipBytes为相对跳转

        for(int i=0;i<Employee.LEN;i++)
        {
            strName += raf.readChar();
        }
        System.out.println(strName.trim()+":"+raf.readInt());
        strName = "";//清空字符串变量

        /************第3个员工的信息************/            
        raf.skipBytes(Employee.LEN*2+4);
        for(
  评论这张
 
阅读(694)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017