java使用RandomAccessFile类基于指针读写文件

读写模式

使用该类时可以指定对要操作文件的读写模式

/**
 * r:以只读方式打开指定文件。如果试图对该RandomAccessFile指定的文件执行写入方法则会抛出IOException
 * rw:以读取、写入方式打开指定文件。如果该文件不存在,则尝试创建文件
 * rws:以读取、写入方式打开指定文件。相对于rw模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备,
 *      默认情形下(rw模式下),是使用buffer的,
 *      只有cache满的或者使用RandomAccessFile.close()关闭流的时候儿才真正的写到文件
 * rwd:与rws类似,只是仅对文件的内容同步更新到磁盘,而不修改文件的元数据
 */
RandomAccessFile file = new RandomAccessFile("C:\\123.txt", "r");
RandomAccessFile file2 = new RandomAccessFile(new File(""), "rw");
RandomAccessFile file3 = new RandomAccessFile(new File(""), "rws");
RandomAccessFile file4 = new RandomAccessFile(new File(""), "rwd");

文件读写操作

写文件

public static void main(String[] args) throws IOException {
    RandomAccessFile file = new RandomAccessFile("C:\\Users\\Lenovo\\Desktop\\123.txt", "rw");
    //写出一个字节,写出的是int值的低8位,其它位舍弃
    file.write(97);//0110 0001
    file.close();
}

运行结果
在这里插入图片描述

读文件

public static void main(String[] args) throws IOException {
    RandomAccessFile file = new RandomAccessFile("C:\\Users\\Lenovo\\Desktop\\123.txt", "rw");
    int read = file.read();//每次读一个字节,填充到int的低八位
    file.close();
    System.out.println(read);
}

运行结果
在这里插入图片描述
RandomAccessFile类中还封装了对8中基本数据类型的读写操作,使用起来会很方便。分别为:readByte()、readShort()、readInt()、readLong()、readFloat()、readDouble()、readBoolean()、readChar(),返回值类型均为对应的基本数据类型。同时相应的也有这八种writeByte()…方法。这是在流式读写文件中所不具有的。
示例:

public class Demo {
    public static void main(String[] args) throws IOException {
        int a = 97;
        File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
        RandomAccessFile res = new RandomAccessFile(file, "rw");
        //虽然能写入,但是在记事本中打开仍乱码字符(由于写入的是二进制文件)
        res.write(a >>> 24);//11111111
        res.write(a >>> 16);
        res.write('我');
        res.write(a);

        //获取当前指针位置
        long pos = res.getFilePointer();
        //!!注意,返回值是字节4,前面写入的四个字节对应从0--3字节
        System.out.println("pos:" + pos);//4

        //将int值分成四部分写入
        res.writeInt(255);
        System.out.println("pos:" + res.getFilePointer());//8

        //将long值分成八个字节写入
        res.writeLong(255);
        System.out.println("pos:" + res.getFilePointer());//16

        //将float值分成四个字节写入
        res.writeFloat(8);
        System.out.println("pos:" + res.getFilePointer());//20

        //将double值分成八个字节写入
        res.writeDouble(12.1);
        System.out.println("pos:" + res.getFilePointer());//28

        //由byte数组的大小决定指针向后移动多少位
        res.write(new byte[]{1, 1});
        System.out.println("pos:" + res.getFilePointer());//30
        res.writeBoolean(false);
        System.out.println("pos:" + res.getFilePointer());//31
        res.writeChar(1);

        //此时指针指向文件最后一个位
        System.out.println(res.read());//-1

        /*
         *void seek(long pos)
         *将指针移动到指定位置
         * */
        res.seek(0);
        System.out.println("point:" + res.getFilePointer());//0

        //读取刚刚写入的long值
        res.seek(8);
        long l = res.readLong();
        System.out.println("读出的long值:" + l);//255

        //读取刚刚写入的double值
        res.seek(20);
        System.out.println("读出的double值:" + res.readDouble());//12.1
        res.close();
    }

运行结果
在这里插入图片描述

示例:将文件A的内容复制到文件B

RandomAccessFile res = new RandomAccessFile("C:\\Users\\Lenovo\\Desktop\\123.txt", "r");
File file = new File("C:\\Users\\Lenovo\\Desktop\\456.txt");
if (!file.exists()) {
    file.createNewFile();
}
RandomAccessFile dest = new RandomAccessFile(file, "rw");
System.out.println(res.length());
while (res.getFilePointer() < res.length()) {
    dest.write(res.read());
}
res.close();
dest.close();

文件指针操作

long getFilePointer():该方法用于返回当前指针位置

ps:

  1. RandomAccessFile是基于指针读写,总是在指针当前位置读写
  2. 进行了读或写一个字节后,指针都会自动向后移动到下一个字节的位置
  3. 默认创建出来RandomAccessFile时,指针位置为0,即:文件的第一个字节的位置
File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
System.out.println(res.getFilePointer());//获取指针位置
res.read();
System.out.println(res.getFilePointer());//获取指针位置
res.close();

运行结果
在这里插入图片描述

void seek(long pos):该方法可以设定指针位置

File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
System.out.println(res.getFilePointer());//初始指针位置
res.seek(4);//指定位置
System.out.println(res.getFilePointer());
res.seek(2);//指定位置
System.out.println(res.getFilePointer());
res.close();

运行结果
在这里插入图片描述

int skipBytes(int n):该方法可以跳过n个字节

File file = new File("C:\\Users\\Lenovo\\Desktop\\123.txt");
RandomAccessFile res = new RandomAccessFile(file, "rw");
System.out.println(res.getFilePointer());//初始指针位置
        
res.seek(4);//指定位置
System.out.println(res.getFilePointer());
        
res.seek(2);//指定位置
System.out.println(res.getFilePointer());
        
int i = res.skipBytes(3);//调过3个字节
System.out.println("跳过" + i + "个字节");
System.out.println(res.getFilePointer());
res.close();

运行结果
在这里插入图片描述
这就是RandomAccessFile类的基本用法,就先介绍到这,有机会在深入介绍

发布了85 篇原创文章 · 获赞 90 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/engerla/article/details/102953405