随机存取文件流

概念

  1. RandomAccessFile声明在java.io包下,但直接继承Object类。并实现了DataInput,DataOutput这两个接口,意味着该类既可以读也可以写。
  2. RandomAccessFile类支持"随机访问"的方式,程序可直接跳到文件的任意位置来读,写文件。
    1. 支持只访问文件的部分内容
    2. 可以向已存在的文件后追加内容
  3. RandomAccessFile对象包含一个记录指针,用以标示当前读写的位置。RandomAccessFile类对象可以自由移动记录指针:
    1. long getFilePointer():获取文件记录指针的当前位置
    2. void seek(long pos):将文件记录指针定位到pos位置

构造器

  1. 构造器
    1. public RandomAccessFile(File file, String mode)
    2. public RandomAccessFile(String name, String mode)
  2. 创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
    1. r: 以只读方式打开
    2. rw :打开以读取和写入
    3. rwd: 打开以读取和 写入;同步文件内容的更新
    4. rws: 打开以便读取和 写入; 同步文件内容和元数据的更新
  3. 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。

应用

实现对图片的复制操作

		RandomAccessFile raf = null;
        RandomAccessFile raf2 = null;
        try {
            raf = new RandomAccessFile("爱情与友情.jpg", "r");
            raf2 = new RandomAccessFile("爱情与友情raf.jpg", "rw");

            byte[] buffer = new byte[1024];
            int len;
            while ( (len = raf.read(buffer)) !=-1){
                raf2.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (raf != null) {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (raf2 != null) {
                try {
                    raf2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

在原有内容某处进行数据插入操作

		RandomAccessFile raf = null;
        ByteArrayOutputStream baos = null;
        try {
            raf = new RandomAccessFile("hello.txt", "rw");
            // 将从4个字符开始后的内容复制
            raf.seek(3);
            // 方式一
//            保存指针3后面的所有数据到StringBuilder中
            /*StringBuilder sb = new StringBuilder((int)new File("hello.txt").length());
            byte[] buffer = new byte[1024];
            int len;
            while ( (len = raf.read(buffer)) != -1){
                sb.append(new String(buffer,0,len));
            }*/
            // 方式二
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[10];
            int len;
            while((len = raf.read(buffer)) != -1){
                baos.write(buffer, 0, len);
            }

            //再次将指针调到角标为3的位置
            raf.seek(3);
            //在原有内容上进行覆盖操作,并不会覆盖原文件的所有内容
            raf.write("xyz".getBytes());
            //写入复制的内容
            // 方式一
            //将StringBuilder中的数据写入到文件中
//            raf.write(sb.toString().getBytes());
            // 方式二
            raf.write(baos.toString().getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (raf != null) {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
发布了91 篇原创文章 · 获赞 2 · 访问量 2431

猜你喜欢

转载自blog.csdn.net/zhixingwu/article/details/103225912