RandomAccessFile 类的使用——基本使用
发布日期:2021-07-27 04:56:59
浏览次数:4
分类:技术文章
本文共 3194 字,大约阅读时间需要 10 分钟。
该类继承的是Object类,而不是任何流类,该类支持读取和写入(读写一体)随机访问文件(这里随机指的是可以自定义位置读写)。
相关方法
//构造方法/*mode模式,常用的有两种:rw打开以便读取和写入; r以只读方式打开*/RandomAccessFile(File file, String mode);RandomAccessFile(String name, String mode);//成员方法,除了以下几个方法,可以在read和write加上基本类型的符号,表示针对某一类型进行读写int read(); //读取一个数据字节String readLine(); String readUTF(); //读取字符串void readFully(byte[] b);void readFully(byte[] b, int off, int len);void write(int b);void writeUTF(String str);//返回文件长度,返回值是longlong length();//自定义读取,根据16进制字节码设置指针 偏移【量】,默认是以十六进制字节码的开头位置位参照void seek(long pos); //从当前位置跳过字节int skipBytes(int n);
注意事项
写入和读取的数据类型的顺序必须一一对应,顺序不可以变化
//写入封装方法public static void write() throws Exception{ //1创建对象 RandomAccessFile raf=new RandomAccessFile("ran.txt", "rw"); //2写入 raf.writeUTF("张三"); ---------------------------------------| raf.writeInt(20); ----------------------------------------| raf.writeDouble(170.5); | raf.writeBoolean(true); | | raf.writeUTF("李四"); | raf.writeInt(22); | raf.writeDouble(180.5); | raf.writeBoolean(false); | | //3关闭 | raf.close(); | System.out.println("写入完毕"); |} |//读取封装方法 |public static void read() throws Exception{ | //1创建对象 | RandomAccessFile raf=new RandomAccessFile("ran.txt", "r"); | | //2读取 | String name = raf.readUTF(); ------------------------------------| int age = raf.readInt(); ----------------------------------------| double height = raf.readDouble(); boolean b = raf.readBoolean(); System.out.println(name+" "+age+" "+height+" "+b); //3关闭 raf.close();}//该方式读取的还是张三的信息,如果需要读取李四的信息,则需要使用seek()或者skipBytes()方法
seek()和skipBytes()方法的执行过程和区别
执行原理分析
//同样以上面的代码为例,将写入的文件使用 EditPlus 打开,并使用Hx十六进制查看文件信息,如下:00 06 E5 BC A0 E4 B8 89 00 00 00 14 40 65 50 0000 00 00 00 01 00 06 E6 9D 8E E5 9B 9B 00 00 0016 40 66 90 00 00 00 00 00 00 /** 【00 06】表示的是占位6个字节的字符串,说明其后的6个位置【E5 BC A0 E4 B8 89】表示“张三”* Int占4个字节,所以【00 00 00 14】表示的是年龄age,14的十六进制转十进制就是20* 同理,double类型占位8个字节,【40 65 50 00 00 00 00 00】表示170.5,最后的【01】表示true* 综上所述,seek要定位在李四位置,即【00 06】的位置,相当于开头的【00】位置,偏移【量】为21*/raf.seek(21);raf.skipBytes(21);
两种方法的区别
/** seek()方法,是指针的偏移量,始终以开头位置为参照,所以如下的代码不会报错*/raf.seek(21);raf.seek(21);/*** skipBytes()方法是跳过,始终以前一个位置为参照,所以会出现EOF Exception,读取到文件末尾的异常*/raf.skipBytes(21);raf.skipBytes(21);
使用 readFully() 方法完成复制操作案例
public class TextDemo01 { public static void main(String[] args) throws Exception { RandomAccessFile file = new RandomAccessFile("file.txt", "rw"); file.writeUTF("这是一个UTF字符串"); file.writeBoolean(true);// 占1个字节 file.writeShort(395);// 占2个字节 file.writeLong(2325451l);// 占8个字节 System.out.println("——————文件复制(从file到fileCopy)——————"); file.seek(0);//从开头位置读取 RandomAccessFile fileCopy = new RandomAccessFile("fileCopy.txt", "rw"); int len = (int) file.length();// 取得文件长度,返回值是long,注意转型 byte[] b = new byte[len]; //全部读取 file.readFully(b); fileCopy.write(b); System.out.println("复制完成!"); }}
转载地址:https://blog.csdn.net/qq_45337431/article/details/99202015 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年09月17日 11时10分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP Curl发送数据
2019-05-27
HTTP协议
2019-05-27
HTTPS
2019-05-27
git add . git add -u git add -A区别
2019-05-27
apache下虚拟域名配置
2019-05-27
session和cookie区别与联系
2019-05-27
PHP 实现笛卡尔积
2019-05-27
Laravel中的$loop
2019-05-27
CentOS7 重置root密码
2019-05-27
Centos安装Python3
2019-05-27
PHP批量插入
2019-05-27
laravel连接sql server 2008
2019-05-27
Laravel 操作redis的各种数据类型
2019-05-27
Laravel框架学习笔记之任务调度(定时任务)
2019-05-27
laravel 定时任务秒级执行
2019-05-27
浅析 Laravel 官方文档推荐的 Nginx 配置
2019-05-27
Swagger在Laravel项目中的使用
2019-05-27
Laravel 的生命周期
2019-05-27
CentOS Docker 安装
2019-05-27
Nginx
2019-05-27