• Java IO 4 : RandomAccessFile


    RandomAccessFile:  

      认识:java输入/输出流体系中功能最丰富的文件内容访问类 既可以读取文件内容,也可以向文件传输数据,并且支持“随机访问“的方式,程序可以跳转到任意地方来读写数据

      特点:与OutputStream/Writer不同,RandomAccessFile允许自由定位记录指针,可以不从开始的地方输出,因此RandomAccessFile可以向已经存在的文件后追加内容,如果程序需要向已经存在的文件后追加内容,应该使用RandomAccessFile

      局限:只能读写文件,不能读写其他IO节点

    RandomAccessFile 两个方法操作文件记录指针

      long getFilePointer()  返回文件记录指针的当前位置
      void seek(long pos)  将文件记录指针定位到pos位置

    RandomAccessFile类为用户提供了两种构造方法:两种方法一个意思,一个是File指定,一个是String指定文件名

      RandomAccessFile(File file, String mode)
      RandomAccessFile(String name, String mode)

    mode的四个值如下:

    模    式 作    用
    r 表示以只读方式打开,调用结果对象的任何write方法都将导致抛出IOException
    rw 打开以便读取和写入,如果该文件尚不存在,则尝试创建该文件
    rws 打开以便读取和写入,相对于"rw",还要求对文件内容或元数据的每个更新都同步写入到底层存储设备
    rwd 打开以便读取和写入,相对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备


      

    public class File03 {
    
        public static void main(String[] args) throws IOException {
            RandomAccessFile raf = new RandomAccessFile("D://demo/a.txt", "r");
            //初始位置为0
            System.out.println("RandomAccessFile文件指针初始位置:" + raf.getFilePointer());
            raf.seek(10);
            byte[] bbuf = new byte[1024];
            int hasRead = 0;
            while((hasRead = raf.read(bbuf)) > 0) {
                System.out.println(new String(bbuf , 0  , hasRead));
            }
        }
    }

    往文件最后追加内容:

         //往文件里面追加内容
            RandomAccessFile raf = new RandomAccessFile("D://demo/a.txt", "rw");
            raf.seek(raf.length());
            raf.write("这是追加的内容".getBytes());

    往文件中间指定的位置添加内容:

      RandomAccessFile不能向文件指定的内容插入内容,如果直接插,要把指定指针后的内容先读入一个临时的地方存起来, 插入需要的内容后, 再去将临时存储的内容读过来。

      /**
         * 使用RandomAccessFile 向文件指定的位置添加内容
         * @throws IOException 
         */
        public static void insert(String fileName , long pos , String insertContent) throws IOException {
            
            File temp = File.createTempFile("temp", null);
            temp.deleteOnExit(); //jvm 退出时删除临时文件
            
            FileOutputStream tempOut = new FileOutputStream(temp);
            FileInputStream tempIn = new FileInputStream(temp);
            
            RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
            System.out.println(raf.length());
            raf.seek(pos);
            //将插入点后的内容读取到临时文件
            byte[] bbuf = new byte[100];
            int hasRead = 0;
            while((hasRead = raf.read(bbuf)) > 0) {
                tempOut.write(bbuf, 0, hasRead);
            }
            //重新回到插入点 , 将需要添加的内容添加到到文件
            raf.seek(pos);
            raf.write(insertContent.getBytes());
            //将临时文件中的内容添加到原文件当中
            while((hasRead = tempIn.read(bbuf)) > 0) {
                raf.write(bbuf, 0, hasRead);
            }
        }
        
        public static void main(String[] args) throws IOException {
            insert("D://demo/a.txt", 10 , "这是追加到文件中间的内容");
        }

     

     

    温故而知新
  • 相关阅读:
    java 新建文件夹保存
    android AppWidgwtProvider学习
    GPS定位
    android ContentProvider学习
    Android 解屏幕锁与点亮屏幕(来电时效果)
    RecyclerView 分页滑动,设置可以滑动下一页,下一个item作为起点方法
    Glide 加载图片 到动态ImageView
    一个例子了解 HandlerThread,Looper,ThreadLocal,Handler,MessageQueue,Message的关系
    android TabLayout 相关
    屏幕相关
  • 原文地址:https://www.cnblogs.com/Uzai/p/9647813.html
Copyright © 2020-2023  润新知