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 类支持 "随机访问" 的方式 ...
随机推荐
- Shell学习之Shell特性(一)
Shell学习之Shell特性 目录 命令和文件自动补齐功能 命令历史记忆功能 history.上下键.!number.!string.!$.!! 别名功能 alias.unalias cp.~use ...
- Scala面向接口
trait Logger{ def log(message:String){ println("Logger:"+message) } } trait RichLogger ext ...
- internet连接共享
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_shai nternet连接共享 允许其他网络用户通过此计算机的internet连接来连接
- C#全能数据库操作类及调用示例
C#全能数据库操作类及调用示例 using System; using System.Data; using System.Data.Common; using System.Configuratio ...
- bootStrap中的ul导航3-垂直导航
<div class="container"> <br/> <ul class="nav nav-pills nav-stacked&quo ...
- Android摘抄总结
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:葛小葛链接:http://www.zhihu.com/question/27069588/answer/38417756来源: ...
- 安装Git 创建版本库
安装git [root@node1 ~]# yum -y install git 创建用户 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址 [root@node ...
- AppleScript脚本学习记录《一》
tell命令块 tell application "Finder" display dialog "Hello World" end tell 声明变量 set ...
- cocos2d-x入门学习--准备篇
1.Cocos2D最早是一款用Python语言开发的游戏引擎.Cocos2D是一个开源框架,用于构建二维游戏,演示程序和其他图形界面交互应用等. 2.x的包含两个意思:一方面是C++的文件扩展为CXX ...
- Jenkins和maven自动化构建java程序
转自:http://www.cnblogs.com/gao241/archive/2013/04/08/3008380.html,版权归原作者所有. Jenkins是一个非常出色的持续集成服务器,本文 ...