Java IO(六、随机存取文件流RandomAccessFile)

Java IO. RandomAccessFile

RandomAccessFile 是IO体系中功能强大的文件内容访问类,声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了DataInput、DataOutput这两个接口,它提供了众多的方法来访问文件内容,既可以读也可以写。与普通的IO流不同的是,RandomAccessFile 支持"随机访问",程序可以直接跳转到文件的任意地方来读写数据。

构造方法:

  • public RandomAccessFile(File file, String mode): 创建随机访问文件流,从File参数指定的文件中读取,也可以选择写入。
  • public RandomAccessFile(String name, String mode):创建随机访问文件流,从具有指定名称的文件中读取,也可以选择写入。

参数mode指定RandomAccessFile的访问模式:

  • r: 以只读方式打开。
  • rw:打开支持读取和写入。
  • rwd:打开支持读取和写入,并且同步文件内容的更新。
  • rws:打开支持读取和写入;并且同步文件内容和元数据的更新。

如果模式为只读r,会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。如果模式为读写rw,如果文件存在会直接操作,如果文件不存在则会去创建文件。

指针位置相关方法:

  • long getFilePointer():获取文件记录指针的当前位置
  • void seek(long pos):将文件记录指针定位到pos位置

1、实现数据的读写操作

RandomAccessFile可以作为一个输入流,也可以作为一个输出流
当其作为输出流时,入伙写出到的文件不存在,则在执行过程中自动创建。如果写出到的文件存在,则会对原有文件内容进行覆盖(默认从头覆盖)。

import java.io.*;

public class RandomAccessFileTest {
    public static void main(String[] args) {
        RandomAccessFile raf1 = null;
        RandomAccessFile raf2 = null;
        try {
            raf1 = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\test.txt", "r");//只读
            raf2 = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\test1.txt", "rw");//可读写
            System.out.println("当前的RandomAccessFile的初始指针位置是:" + raf1.getFilePointer());
            //设置文件指针的偏移量
            raf1.seek(4);
            System.out.println("设置偏移量之后的指针位置是:" + raf1.getFilePointer());
            int len;
            byte[] bytes = new byte[1024];
            while ((len = raf1.read(bytes)) != -1) {
                String str = new String(bytes, 0, len, "gbk");
                raf2.write(bytes, 0, len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(raf1 != null){
                try {
                    raf1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(raf2 != null){
                try {
                    raf2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

程序运行结果:
结果


2、实现数据的插入操作

可以通过相关的操作,实现RandomAccessFile“插入”数据的效果。

public class RandomAccessFileTest {
    public static void main(String[] args) {
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\test.txt", "rw");
            System.out.println("当前的RandomAccessFile的初始指针位置是:" + raf.getFilePointer());
            //设置文件指针的偏移量
            raf.seek(6);
            System.out.println("设置偏移量之后的指针位置是:" + raf.getFilePointer());
            //保存指针6后面的所有数据到StringBuilder中
            StringBuilder builder = new StringBuilder((int) new File("C:\\Users\\Administrator\\Desktop\\test.txt").length());
            int len;
            byte[] bytes = new byte[1024];
            while ((len = raf.read(bytes)) != -1) {
                builder.append(new String(bytes,0,len,"gbk"));
            }

            //调回指针,写入“插入语句”
            raf.seek(6);
            raf.write("插入语句".getBytes("gbk"));

            //将StringBuilder中的数据写入到文件中
            raf.write(builder.toString().getBytes("gbk"));

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(raf != null){
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:
运行结果

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值