Java-IO流系列-随机存取文件流

随机存取文件流

简介

  • RandomAccessFile声明在java.io包下, 但直接继承于java.lang.Object类。 并且它实现了Datalnput. DataOutput这两 个接口,也就意味着这个类既可以读也可以写。

  • RandomAccessFile类支持“随机访问"的方式,程序可以直接跳到文件的任意地方来读、写文件

    • 支持只访间文件的部分内容
    • 可以向已存在的文件后追加内容
  • RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。

  • RandomAccessFile类对象可以自由移动记录指针:

    • long getFilePointer(): 获取文件记录指针的当前位置
    • void seek(long pos): 将文件记录指针定位到pos位置

构造器

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

创建RandomAccessFile类实例需要指定一个mode参数,该参数指定RandomAccessFile的访问模式:

  • r:以只读方式打开
  • rw:打开以便读取和写入
  • rwd:打开以便读取和写入;同步文件内容的更新
  • rws:打开以便读取和写入:同步文件内容和元数据的更新

如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为w读写。如果文件不存在则会去创建文件,如果存在则不会创建。

样例

复制文件

package com.dreamcold.io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Demo20 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf1= new RandomAccessFile(new File("image.jpg"),"r");
        RandomAccessFile raf2= new RandomAccessFile(new File("image4.jpg"),"rw");
        byte[] buffer=new byte[1024];
        int len;
        while((len=raf1.read(buffer))!=-1){
            raf2.write(buffer,0,len);
        }
        raf1.close();
        raf2.close();
    }
}

效果:

image-20210119165133196

写入txt文件

如果RandomaccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建
如果写出到的文件存在,则会对原有文件内容进行覆盖。|

package com.dreamcold.io;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Demo21 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf1=new RandomAccessFile("hello1.txt","rw");
        raf1.write("dreamcold".getBytes());
        raf1.close();
        
    }
}

效果:

image-20210119165436966

数据插入的效果

可以通过相关的操作,实现RandomAccessFile"插入重据的效果

package com.dreamcold.io;

import java.io.IOException;
import java.io.RandomAccessFile;

public class Demo22 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf1=new RandomAccessFile("hello1.txt","rw");
        //将指针调到角标为3的位置
        raf1.seek(3);
        //保存指针3之后的所有的数据到StringBuilder中
        StringBuilder builder=new StringBuilder();
        byte[] buffer=new byte[20];
        int len;
        while ((len=raf1.read(buffer))!=-1){
            builder.append(new String(buffer,0,len));
        }
        //调回指针写入"xyz"
        raf1.seek(3);
        raf1.write("xyz".getBytes());
        //将StringBuiler中的数据写入文件
        raf1.write(builder.toString().getBytes());
        raf1.close();
    }
}

结果:

image-20210119170542862

原文地址:https://www.cnblogs.com/mengxiaoleng/p/14940271.html