使用 RandomAccessFile 实现数据插入的效果

public class StreamTest07 {
    //
    /**
     * RandomAccessFile的使用
     * 1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
     * 2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
     * 3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。
     *   如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)
     */
    @Test
    public void testRandomAccessFile01(){
        //RandomAccessFile 可以随时存取文件 有指针,记录指针用以标示当前读写处的位置
        //虽然 RandomAccessFile 可以 存取,但是在存取时需要分别创建对象,不能在一个对象上存取
        RandomAccessFile randomAccessFile = null;
        try {
            randomAccessFile = new RandomAccessFile(new File("testRandomAccessFile02.txt"),"rw");
            /*
                指定mode格式
                r: 以只读方式打开
                rw:打开以便读取和写入
                rwd:打开以便读取和写入;同步文件内容的更新
                rws:打开以便读取和写入;同步文件内容和元数据的更新
             */
            randomAccessFile.write("asdadasdasda".getBytes(StandardCharsets.UTF_8));
            //存入字符串,这里需要把字符串转成字节数组存入,因为write方法参数格式需要为byte[],String类的getBytes()会返回字节数组
            //getBytes()方法如果不指定字符集,则得到的是一个操作系统默认的编码格式的字节数组;如果指定字符集,则得到的是在指定字符集下的字节数组
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            if (randomAccessFile != null){
                try {
                    randomAccessFile.close();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }
    //在索引为 3 的位置插入字符串
    /*
        策略:
        先把索引 3 后面的字符串保存下来
        然后将指针移动到 3 进行 write 操作(写入需要插入的字符)
        此时指针在刚写完的位置
        然后将之前保存的字符串在后面继续写入,因为 RandomAccessFile的特性,会从指针开始进行内容替换
     */
    @Test
    public void testRandomAccessFile02(){
        RandomAccessFile randomAccessFile1 = null;
        try {
            randomAccessFile1 = new RandomAccessFile(new File("testRandomAccessFile02.txt"), "rw");
            //在索引为 3 的位置插入字符串 xyz
            randomAccessFile1.seek(3);
            //创建 StringBuilder 指定容量为 字符串长度
            StringBuilder stringBuilder = new StringBuilder("testRandomAccessFile.txt".length());
            byte[] bytes = new byte[20];
            int len;
            //把 索引3 后面的字符串添加到 stringBuilder
            while ((len = randomAccessFile1.read(bytes)) != -1){//添加完指针移动到末尾
                //需要添加参数为 String 类型,new一个String对象来存入
                stringBuilder.append(new String(bytes,0,len));
            }
            randomAccessFile1.seek(3);//因为上一步指针移动至末尾,需要重新定位
            randomAccessFile1.write("xyz".getBytes(StandardCharsets.UTF_8));
            randomAccessFile1.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
            //执行结果 asdxyzadasdasda
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            if (randomAccessFile1 != null){
                try {
                    randomAccessFile1.close();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值