[Java核心API]IO流--随机访问文件RandomAccessFile

1.随机访问文件基础知识

package day06file;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
 * java.io.RandomAccessFile 该类是基于指针形式读取文件数据的
 */
public class RandomAccesFileDemo {
    public static void main(String[] args) throws IOException {
        /**
         * RandomAccessFile的两种创建模式 r:只读模式,仅对文件数据进行读取模式 rw:读写模式,可以对文件数据进行读写操作
         * RandomAccessFile的第一参数可以传入字符串(文件路径),也可以传入file对象
         */
//      写入文件
        RandomAccessFile raf = new RandomAccessFile("raf.dat", "rw");
        // void write(int d)该方法向文件中写入1个字节,写的是当前int值对应的2进制的“低8位”
        raf.write(1);
        System.out.println("写入完毕");
        raf.close();

//      读取文件数据
        // int read()读取一个字节,并将该字节以十进制形式返回,若返回值为-1,则表示读取到文件末尾
        RandomAccessFile r = new RandomAccessFile("raf.dat", "r");
        int d = r.read();
        System.out.println(d);
    }
}
/*
 * 运行结果: 写入完毕 1
 */

2.随机访问文件指针

package day06fileraf;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RAFPointer {
    public static void main(String[] args) throws IOException {
        /**RandomAccessFile提供了方便读写基本列型数据的相关方法*/
        /**文件指针操作
         * long getFilePointer()该方法可以获取当前raf的指针位置。
         * 刚创建的raf指针默认在文件的第一个字节位置上,以下标形式表示位置,即:0
         * raf总是基于指针当前位置进行读写字节,无论进行的是读还是写,进行后指针都会自动向后移动。*/
        RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
        long pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:0
        /*向文件中写入一个int最大值
         * 01111111 11111111 11111111 11111111
         *                      vvvvvvvv void write(int a)写出的是二进制的“低8位”*/
        int imax = Integer.MAX_VALUE;
        raf.write(imax>>>24);//1字节,8byte
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:1

        raf.write(imax>>>16);//1字节,8byte
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:2

        raf.write(imax>>>8);//1字节,8byte
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:3

        raf.write(imax);//1字节,8byte
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:4

        /*void writeInt(int a)连续写出4个字节,将“int值对应的二进制”全部写出
         * void wirte(int a)写出的是“二进制”*/
        raf.writeInt(imax);//int 4字节
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:8
        //写入long
        raf.writeLong(1234556L);//long 8字节
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:16
        //写入double
        raf.writeDouble(123.123);//double 8字节
        pos = raf.getFilePointer();
        System.out.println("pos:"+pos);//pos:24
        //最终查看raf.dat24个字节

        /*读取int值
         * 若读取时发现是文件末尾,则抛出EOFException      End Of Exception文件末尾异常*/
        int b = raf.read();
        System.out.println(b);//-1

//      b  = raf.readInt();//EOFException End Of Exception文件末尾

        /*void seek(long pos)
         * 该方法可以将当前raf的指针移动到指定位置处*/
        //将指针 移动到文件的第一个字节处
        raf.seek(0);

        /*
        b = raf.read();
        System.out.println(b);//127
        b = raf.read();
        System.out.println(b);//255
        b = raf.read();
        System.out.println(b);//255
        b = raf.read();
        System.out.println(b);//255
        等价于如下
         */
        b = raf.readInt();
        System.out.println(b);//imax  int最大值
        System.out.println("pos:"+raf.getFilePointer());//4
        b = raf.readInt();
        System.out.println(b);//imax
        System.out.println("pos:"+raf.getFilePointer());//8

        long l = raf.readLong();
        System.out.println(l);//lmax long最大值
        System.out.println("pos:"+raf.getFilePointer());//16

        double d = raf.readDouble();
        System.out.println(d);//dmax double最大值
        System.out.println("pos:"+raf.getFilePointer());//24

        //再读一次double
        raf.seek(16);
        d = raf.readDouble();
        System.out.println(d);
        System.out.println("pos:"+raf.getFilePointer());//24

        System.out.println("写入完毕");
        raf.close();
    }
}

3.使用随机访问文件实现复制文件

package day06file;
import java.io.IOException;
import java.io.RandomAccessFile;
/** 使用RandomAccessFile实现复制文件
 * */
public class RandomAccessFileCopy {
    public static void main(String[] args) throws IOException {
//      按照字节的方式进行复制
        RandomAccessFile src = new RandomAccessFile("raf.dat", "r");// 源文件
        RandomAccessFile des = new RandomAccessFile("raf_1.dat", "rw");// 目标文件
        int len = -1;
        while ((len = src.read()) != -1) {// 按字节读取
            des.write(len);// 按字节写入
        }
        System.out.println("按照单字节方式复制完毕");
        src.close();
        des.close();

//      按照字节数组的方式进行复制
        RandomAccessFile src1 = new RandomAccessFile("raf.dat", "r");// 源文件
        RandomAccessFile des1 = new RandomAccessFile("raf_2.dat", "rw");// 目标文件
        int ln = -1;
        byte[] buf = new byte[1024*10];
        while((ln=src1.read(buf))!=-1){
            des1.write(buf, 0, ln);
        }
        System.out.println("按照字节数组方式复制完毕");
        src1.close();
        des1.close();
    }
}

4.简述RandomAccessFile类的read方法和write方法使用int类型存储byte数据的方式和原因

1)RandomAccessFile提供了一个可以从文件中读取字节的方法:
  int read()
  该方法会从文件中读取一个byte(8位) 填充到int的低八位, 高24位为0, 返回值范围正数: 0~255, 如果返回-1表示读取到了文件末尾! 每次读取后自动移动文件指针, 准备下次读取。
2)RandomAccessFile提供了一个可以向文件中写出字节的方法:
  void write(int d)
  该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出。
3)使用int类型存储byte数据,这是因为,RandomAccessFile类的read方法,能读到的数据有257个数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值