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

来源:互联网 发布:假面骑士drive知乎 编辑:程序博客网 时间:2024/05/01 05:59

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个数
0 0
原创粉丝点击