RandomAccessFile类理解
一、简述

这个是JDK上的截图,我们可以看到它的父类是Object,没有继承字节流、字符流家族中任何一个类。并且它实现了DataInput、DataOutput这两个接口,也就意味着这个类既可以读也可以写。
RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,既可以读取文件内容,也可以向文件输出数据。与普通的输入/输出流不同的是,RandomAccessFile支持跳到文件任意位置读写数据,RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置,当程序创建一个新的RandomAccessFile对象时,该对象的文件记录指针对于文件头(也就是0处),当读写n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针
RandomAccessFile包含两个方法来操作文件记录指针
- long getFilePointer():返回文件记录指针的当前位置
- void seek(long pos):将文件记录指针定位到pos位置
RandomAccessFile类在创建对象时,除了指定文件本身,还需要指定一个mode参数
该参数指定RandomAccessFile的访问模式,该参数有如下四个值:
- r:以只读方式打开指定文件。如果试图对该RandomAccessFile指定的文件执行写入方法则会抛出IOException
- rw:以读取、写入方式打开指定文件。如果该文件不存在,则尝试创建文件
- rws:以读取、写入方式打开指定文件。相对于rw模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备,默认情形下(rw模式下),是使用buffer的,只有cache满的或者使用RandomAccessFile.close()关闭流的时候儿才真正的写到文件
- rwd:与rws类似,只是仅对文件的内容同步更新到磁盘,而不修改文件的元数据
二、代码示例
public static void main(String[] args){
RandomAccessFile randomAccessFile = null;
try {
// 可读写
randomAccessFile = new RandomAccessFile(new File("d:\\new.txt"), "rw");
// 写
for (int i = 1; i <= 10; i++) {
randomAccessFile.write((i+" 设备名/devicename,设备数量/devicenum\n\r").getBytes());
System.out.println("当前指针位置:"+randomAccessFile.getFilePointer());
}
// randomAccessFile.writeBoolean(true);
// randomAccessFile.writeByte(11);
// randomAccessFile.writeDouble(12);
// randomAccessFile.writeUTF("操作");
// 读
randomAccessFile.seek(0);// 读时指针重新置为开始位置,事实上可以从文件内容的任何位置开始
byte[] bs = new byte[1024];
int len=0;
while ((len=randomAccessFile.read(bs))!=-1) {
System.out.println(new String(bs, 0, len));
}
// System.out.println("readLine:"+ randomAccessFile.readLine());
// System.out.println("readDouble:"+randomAccessFile.readDouble());
// System.out.println("readByte:"+randomAccessFile.readByte());
// System.out.println("readUTF:"+randomAccessFile.readUTF());
// 追加写
randomAccessFile.seek(randomAccessFile.length());// 指针移到文件末尾
randomAccessFile.write((21+" 设备名/devicename,设备数量/devicenum\n\r").getBytes());
// 任意位置插入写
int position = 102;
String insetstr = "----------------------";
randomAccessFile.seek(position);// 指定插入的位置
// 先把该位置后的所有内容先缓存起来,防止被覆盖
List<byte[]> blists = new ArrayList<>();
byte[] bs1 = new byte[1024];
while (randomAccessFile.read(bs1)!=-1) {
blists.add(bs1);
}
randomAccessFile.seek(position);// 再次返回指定位置
// 插入要插入的内容
randomAccessFile.write(insetstr.getBytes());
// 再把缓存的内容写入
for (int i = 0; i < blists.size(); i++) {
byte[] cachestr = blists.get(i);
randomAccessFile.write(cachestr);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally{
if (randomAccessFile!=null) {
try {
randomAccessFile.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
文件内容
1 设备名/devicename,设备数量/devicenum 2 设备名/devicename,设备数量/devicenum 3 设备----------------------名/devicename,设备数量/devicenum 4 设备名/devicename,设备数量/devicenum 5 设备名/devicename,设备数量/devicenum 6 设备名/devicename,设备数量/devicenum 7 设备名/devicename,设备数量/devicenum 8 设备名/devicename,设备数量/devicenum 9 设备名/devicename,设备数量/devicenum 10 设备名/devicename,设备数量/devicenum 11 设备名/devicename,设备数量/devicenum 12 设备名/devicename,设备数量/devicenum 13 设备名/devicename,设备数量/devicenum 14 设备名/devicename,设备数量/devicenum 15 设备名/devicename,设备数量/devicenum 16 设备名/devicename,设备数量/devicenum 17 设备名/devicename,设备数量/devicenum 18 设备名/devicename,设备数量/devicenum 19 设备名/devicename,设备数量/devicenum 20 设备名/devicename,设备数量/devicenum 21 设备名/devicename,设备数量/devicenum
RandomAccessFile类理解的更多相关文章
- 使用RandomAccessFile类对文件进行读写
1. RandomAccessFile类简介 前面一篇随笔<File类遍历目录及文件>中有说到,File类只能用于表示文件或目录的名称.大小等信息,而不能用于文件内容的访问.而当需要访 ...
- [Java IO]01_File类和RandomAccessFile类
File类 File类是java.io包中唯一对文件本身进行操作的类.它可以进行创建.删除文件等操作. File类常用操作 (1)创建文件 可以使用 createNewFille() 创建一个新文 ...
- RandomAccessFile类
File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据. //============ ...
- DataInputStream类和RandomAccessFile类的使用方法
// DataInputStream类实现了DataInput接口,要想从文件中读入二进制数据, // 你需要将DataInputStream与某个字节源相结合,例如FileInputStream / ...
- File类和RandomAccessFile类
目录 File类 File类常用操作 (1)创建文件 (2)删除文件 (3)创建文件夹 (4)列出指定目录全部文件 (5)删除目录 RandomAcce ...
- JavaIO流(02)RandomAccessFile类详解
RandomAccessFile类 该类主要是对文件内容进行操作,可以随机的读取一个文件中指定位置的数据: 但是如果想实现这样的功能,则每个数据的长度应该保持一致: 构造方法: 接受File类 ...
- 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载
主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...
- 【Java IO流】RandomAccessFile类的使用
RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...
- 输入和输出--RandomAccessFile类
RandomAccessFile 类 RandomAccessFile 类既可以读取文件内容,也可以向文件输出数据. RandomAccessFile 类支持 "随机访问" 的方式 ...
随机推荐
- Java开发人员必须掌握的Linux命令(一)
子曰:"工欲善其事,必先利其器." 1.登录服务器SSH命令 简单说,SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机, ...
- grant 权限 on 数据库对象 to 用户
grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant select on testdb.* to common_ ...
- OutputStreramWriter和InputStreamReader类
整个IO类中除了字节流和字符流还包括字节和字符转换流. OutputStreramWriter将输出的字符流转化为字节流 InputStreamReader将输入的字节流转换为字符流 但是不管如何操作 ...
- Object类浅析
Object类的方法有: hashCode(): 返回该对象的哈希码值 hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回 ...
- C# 中删除控件的事件的方法类
方法一: 代码 /// <summary> /// 删除指定控件的指定事件 /// </summary> /// <param name="control&qu ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- Python3练习题系列(09)——物以类聚,人以群分
目标: 用类管理同类事物 解析: 用到“class”的编程语言被称作“Object Oriented Programming(面向对象编程)”语言.首先你需要做出“东西”来,然后你“告诉”这些东西去完 ...
- Flask的使用2
1.Flask文件的配置 # 方式一: # 直接书写 app.config['SESSION_COOKIE_NAME'] = 'session_lvning' # 方式二: #引入setting.py ...
- jd-gui的使用方法
java的反编译工具,简单使用: 打开文件.单击“file”从中选择“Open File ...“选项,弹出一个文件选择框,可以选择要打开的文件,或者直接单击文件夹图标,直接弹出文件选择框:从文件选择 ...