Java RandomAccessFile

RandomAccessFile

RandomAccessFile

RandomAccessFile 类是JAVA IO流体系中功能最丰富的文件内容访问类。
可以读取文件内容,也可以写入,支持随机访问, 跳转到任意位置读写数据。
与 OutputStream , Writer 输出流不通,允许自由定位文件记录指针。
RandomAccessFile 只能读写文件,不能读写其他IO设备。

public class RandomAccessFile implements DataOutput, DataInput, Closeable {
}

方法

RandomAccessFile 对象包含一个记录指针,用以标识当前读写处的位置。
下面方法记录指针:

  • getFilePointer(): 返回指针当前位置
  • seek(long pos): 将指针定位到 pos位置

RandomAccessFile 包含了类似于 InputStream 的三个 read()方法,
也包含类似于OutputStream的三个write() 方法。
还包含一系列 readXxx() 和 writeXxx() 方法

两个构造器, 一个用 String 作参数, 一个是 File参数。
访问模式:

  • r : 只读
  • rw : 读写
  • rws : 读写, 对文件内容或元数据的每个更新同步写入到底层存储设备
  • rwd: 读写, 对文件内容的每个更新都同步写入到底层存储设备

移动指针从中间读取和末尾追加:

        try (

                RandomAccessFile ram = new RandomAccessFile("abc.txt", "rw");
                ){
            //初始指针
            System.out.println(ram.getFilePointer());

            //移动指针, 从10开始读取
            ram.seek(10);
            byte[] bytes = new byte[1024];
            int hasRead = 0;
            while ((hasRead = ram.read(bytes)) > 0){
                System.out.println(new String(bytes, 0, hasRead));
            }

            //移动指针到末尾
            ram.seek(ram.length());
            ram.write("添加一部分\r\n".getBytes());
        }
        catch (IOException e){

        }

如果指针移到某位置后开始写入,则新输入内容会覆盖原有内容。
如果要中间插入, 需要把插入点后面的内容写入缓冲区, 插入写完后再追加。

        //临时文件
        File tmp = File.createTempFile("tmp", null);
        tmp.deleteOnExit();
        long pos = 18;
        try(
                RandomAccessFile raf = new RandomAccessFile("abc.txt", "rw");
                FileOutputStream fos = new FileOutputStream(tmp);
                FileInputStream fis = new FileInputStream(tmp)
                ){
            raf.seek(pos);
            //插入点开始内容写入到临时文件
            byte[] bbuf = new byte[64];
            int hasRead = 0;
            while ((hasRead = raf.read(bbuf)) > 0){
                fos.write(bbuf, 0, hasRead);
            }
            //写入内容
            raf.seek(pos);
            raf.write("插入字符".getBytes());
            while ((hasRead = fis.read(bbuf)) > 0){
                raf.write(bbuf, 0, hasRead);
            }

        }
        catch (IOException e){

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值