RandomAccessFile

本文详细介绍了Java中的RandomAccessFile类,包括其构造方法、操作模式、读写基本数据类型的方法等。并给出了如何使用seek方法定位文件指针,实现文件的随机读写,以及如何通过多个线程提高写入效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



该类不算是IO体系中的子类,而是直接继承自Object类的,但是它是IO包中的成员,因为它具备读写功能。内部封装了一个数组,而且可以通过指针对数组的元素进行操作。

可以通过getFilePointer获取指针,还可以通过seek方法改变指针的位置。其实完成读写的原理是:其内部封装了字符输出流和输出流。

通过构造函数可以看出该类可以操作文件;而且操作文件还有格式“r,”rw”,”rws”,”rwd”

RandomAccessFile(File file, String mode)

RandomAccessFile(String name, String mode) 

并且RandomAccessFile中提供了读写基本数据类型的方法法

"rw"操作模式下RandomAccessFile在创建对象时,如果传入的文件不存在,则会创建文件,若存在,则不会创建,既不会覆盖原文件。,但是写入是是从0指针位置开始的,写入的时候会覆盖,如不想覆盖原内容,则可以同过Seek或者skipBytes方法逃过指定的内容在写入

操作文件的模式只能是: "r""rw""rws" "rwd" ;模式为“r”时只能读,不能写,写会报异常,并且“r”操作模式下的RandomAccessFile在创建对象时,不会创建文件只会去读取一个已存在的文件,如果传入的文件不存在,会报异常FileNotFounException

 

 

import java.io.IOException;

import java.io.RandomAccessFile;

 

public classRandomAccessFileDemo {

 

    /**

     * @param args

     */

    public static void main(String[] args)throws IOException{

        // TODO Auto-generated method stub

       

                //writeFile();

                //readFile();

       

        writeFile_2();

    }

   

    //读取文件中的数据,随机读取文件中的数据

    public static void readFile() throws IOException {

        //操作文件的模式只能是: "r""rw""rws" "rwd";模式为“r”时只能读,不能写,写会报异常

        RandomAccessFileraf = newRandomAccessFile("D:\\random.txt","r");

        //获取文件指针位置

            sop(raf.getFilePointer());//0;

            int n = 1;

            raf.seek(12*n);//设置文件指针的位置,在操作过程当中我们可以规定每个人的姓名和年龄所占的字节数,

                          //这样一来我能就能同过seek方法方便读出每个人的名字和年龄,想要读第几个人的名字,只需改变n的值即可

            sop(raf.getFilePointer());//12;

       

        //在用RandomAccessFile读取数据时一定要,按照数据的大小格式来读取,后则会出错

        byte[] b =new byte[8];

        raf.read(b);

       

        //跳过指定的字节数,只能往后跳,往后跳8个字节,即此时读取的年龄是后一个人的年龄

        //raf.skipBytes(12);

        //获取文件指针位置

        sop(raf.getFilePointer());//

       

        int age = raf.readInt();

        sop("name:"+new String(b)+" age :: "+ age);

        //获取文件指针位置

        sop(raf.getFilePointer());

    }

   

    //往文件中写入数据

    public static void writeFile() throws IOException {

        RandomAccessFileraf = newRandomAccessFile("D:\\random.txt","rw");

        //获取文件指针位置

        sop(raf.getFilePointer());

       

        //存入一个人得名字和年龄,为了方便读取,每个人的名字为八个字节,年龄用int的数据

        raf.write("liao li ".getBytes());

        //writeint)方法只是将int的低八位写入,所以当int大于255是就会丢失数据,所以此时要将int转成四个字节再依次写入,或用特定的方法写入

        //raf.write(258);

        raf.writeInt(258);

       

        //存入一个人得名字和年龄 

        raf.write("majingyu".getBytes());

        raf.writeInt(223);

       

        //存入一个人得名字和年龄 

        raf.write("zeng zhi".getBytes());

        raf.writeInt(222);

       

        //获取文件指针位置

        sop(raf.getFilePointer());

       

       

    }

   

    //随机写文件

    public static void writeFile_2() throws IOException {

        //"rw"操作模式下RandomAccessFile在创建对象时,如果传入的文件不存在,则会创建文件

        //,若存在,则不会创建,既不会覆盖原文件。,但是写入是是从0指针位置开始的,写入的时候会覆盖,如不想覆盖原内容,

         //则可以同过Seek或者skipBytes方法逃过指定的内容在写入

        RandomAccessFileraf = newRandomAccessFile("D:\\random.txt","rw");

        //逃过36个字节在写入数据,即相当于在原有数据后面续写数据

        raf.seek(12*3);

        //存入一个人得名字和年龄 

        raf.write("xiaoqing".getBytes());

        raf.writeInt(200);

        //如果要改变某个人得信息也很方便只需要,设置指针位置,在改变即可例如改变第三个人的姓名

        raf.seek(12*2);

        raf.write("lizhikai".getBytes());

       

 

    }

   

    public static void sop(Object o){

        System.out.println(o);

    }

}

 

RandomAccessFile可以看出可以分段往文件中写入数据,这样我们在实际操作中可以通过将要写入的数据分成几个不方,每个部分的写入用以个单独的线程来控制,则这样会大大提高效率。实际上这就是下载的原理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值