欢迎光临散文网 会员登陆 & 注册

java随机访问流RandomAccessFile

2022-08-25 12:54 作者:虚云幻仙  | 我要投稿

/**
* 测试随机访问流RandomAccessFile
* 对文件进行读写操作,不属于字节流/字符流,不同于字节/字符流的顺序读取,随机访问流可以通过指针对任意位置进行读写
*/

public class TestRandomAccessFile {
   public static void main(String[] args) {
       try(RandomAccessFile raf = new RandomAccessFile("iostream/testRandom.txt","rw")) {
           //构造器传参(filename,mode)如果文件路径的某一级路径不存在会抛异常,如果上级路径存在但文件不存在会生成文件,文件存在时读取文件,不会覆盖成空文件。mode分为r只能读和rw可以读写两种权限
           for (int i = 0;i<8;i++){
               raf.writeInt((i+1)*10);
               //随机访问流也可以存储基础数据类型,当不指定指针时默认从index=0开始,写入10-80八个int值
               //随机访问流写入基础数据类型时使用自身的方法实现,没有通过数据流完成

           }
           //随机访问流没有flush()方法
           raf.seek(4);
           //.seek(long pos)调整指针,pos即position,pos每一位是一个字节byte
           System.out.println(raf.readInt());
           //结果为20,int类型需要占用4个字节,第一个int的10的pos从0-3,第二个int的20的pos从4-7,所以将指针移动到4进行.readInt()向后读取4个字节返回int的20
           for (int i = 0;i<8;i+=2){
               //隔一个数读一个数
               raf.seek(i*4);
               //i的值为0 4 8 12 16 20 24 28 对应每个int的第一个byte位,+=2时只为0 8 16 24
               System.out.print(raf.readInt()+",");
               //结果为10,30,50,70,
           }
           System.out.println();

           raf.seek(8);
           raf.writeInt(33);
           //.write方法会从指针位置往后写入,如果有原始数据会覆盖,不会将数据后移
           raf.seek(0);
           for (int i = 0;i<8;i++){
               System.out.print(raf.readInt()+",");
           }
           //结果为10,20,33,40,50,60,70,80, 30被覆盖为33
           //System.out.print(raf.readInt()); 如果已经读完,再次调用.readInt()方法会抛java.io.EOFException

           System.out.println(raf.read());
           //在读完的情况下调用.read()会返回-1
           System.out.println(raf.getFilePointer());
           //.getFilePointer()返回指针当前位置,结果32
           System.out.println(raf.length());
           //.length()返回文件长度/大小/字节数,结果32
           //文件内写入了8个int,每个int占4字节,所以文件大小为32字节,pos从0-31,执行了8次readInt()所以指针位置32到达文件末尾


           raf.seek(8);
           int insertInt = 30;
           int temp;
           long pos;
           while ((pos = raf.getFilePointer()) < raf.length()){
               temp = raf.readInt();
               raf.seek(pos);
               raf.writeInt(insertInt);
               insertInt=temp;
           }
           raf.writeInt(insertInt);
           raf.seek(0);
           while (raf.getFilePointer()<raf.length()){
               System.out.print(raf.readInt()+",");
           }
       } catch (FileNotFoundException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }
   }
}

java随机访问流RandomAccessFile的评论 (共 条)

分享到微博请遵守国家法律