zoukankan      html  css  js  c++  java
  • 【Java】Input,Output,Stream I/O流 05 RandomAccessFile 随机访问文件类

    RandomAccessFile 随机访问文件类

    直接继承java.lang.Object 实现DataInput & DataOutput 接口

    即是输入流,也是输出流

    public class RandomAccessFileTest {
        public static void main(String[] args) throws Exception {
            // mode的四个参数
            // r 只读方式打开     不创建文件,读取一个已存在的文件,文件不存在则抛出异常
            // rw 打开读取和写入  不存在文件则创建,反之直接读取和写入
            // rwd 读取和写入 + 同步内容更新
            // rws 读取和写入 + 同步内容 & 元数据 的更新
            RandomAccessFile raf1 = new RandomAccessFile(new File("1774415.jpg"),"rws");
            RandomAccessFile raf2 = new RandomAccessFile(new File("raf2.jpg"),"rws");
    
            byte[] bytesBuffer = new byte[1024];
            int len;
            while ((len = raf1.read(bytesBuffer)) != -1){
                raf2.write(bytesBuffer,0,len);
            }
    
            raf1.close();
            raf2.close();
        }
    }

    - 作为输出流时,直接覆写文件,没有文件存在创建文件写入,文件存在且已有内容从头覆盖写入

    - 如果要实现插入覆写,可在编写之前,调用 void seek(int index) 方法 设置指针在文件种写入的位置

    - 要在已有内容的基础上追加写入,就要把指针移动到最后一位,最后一位就是File对象的字节长度,file.Length()的位置即可

    - 实现插入写入

      1、先从插入位置读取后面的数据,保存下来

      2、指针此时在最后的位置,我们需要拨回指针位置到原来的插入位置上

      3、调用seek方法,再开始覆写操作,

      4、再把1保存的数据执行覆写

        static void insert() throws Exception {
            RandomAccessFile raf = new RandomAccessFile("sample.txt","rws");
    
            raf.seek(2); // 拨动指针到指定位置
    
            // 设置一个字符串的缓冲类,用于保存我们读取的内容,长度不会超过这个文件的字节长度
            StringBuilder stringBuilder = new StringBuilder((int)new File("sample.txt").length());
    
            byte[] bytesBuffer = new byte[5];
            int len;
            while ( (len = raf.read(bytesBuffer)) != -1){
                // 采用追加方法写进字符串缓冲对象
                stringBuilder.append(raf.read(bytesBuffer,0,len));
            }
    
            // 拨回指针
            raf.seek(4);
    
            // 插入我们需要的数据内容
            raf.write("这是我们插入进去的数据".getBytes());
    
            // 再写入之前保存的数据
            raf.write(stringBuilder.toString().getBytes());
    
            // 释放
            raf.close();
        }

    功能实现了,但是还是乱码....暂时未解决

    关于新IO的介绍  https://www.bilibili.com/video/BV1Kb411W75N?p=618

    在后面继续学习

  • 相关阅读:
    断开ssh链接在后台继续运行命令
    linux 隐藏显示终端光标
    shell脚本中echo显示内容带颜色
    Linux/Unix下pid文件作用浅析
    使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)
    Linux的tmpfs文件系统
    kernel编译
    Qt之读取配置文件
    android之TCP客户端框架
    android之模拟器更新底层
  • 原文地址:https://www.cnblogs.com/mindzone/p/12752912.html
Copyright © 2011-2022 走看看