一、简述

这个是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类理解的更多相关文章

  1. 使用RandomAccessFile类对文件进行读写

    1. RandomAccessFile类简介   前面一篇随笔<File类遍历目录及文件>中有说到,File类只能用于表示文件或目录的名称.大小等信息,而不能用于文件内容的访问.而当需要访 ...

  2. [Java IO]01_File类和RandomAccessFile类

    File类 File类是java.io包中唯一对文件本身进行操作的类.它可以进行创建.删除文件等操作.   File类常用操作 (1)创建文件 可以使用 createNewFille() 创建一个新文 ...

  3. RandomAccessFile类

    File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据. //============ ...

  4. DataInputStream类和RandomAccessFile类的使用方法

    // DataInputStream类实现了DataInput接口,要想从文件中读入二进制数据, // 你需要将DataInputStream与某个字节源相结合,例如FileInputStream / ...

  5. File类和RandomAccessFile类

    目录 File类     File类常用操作     (1)创建文件     (2)删除文件     (3)创建文件夹     (4)列出指定目录全部文件     (5)删除目录 RandomAcce ...

  6. JavaIO流(02)RandomAccessFile类详解

    RandomAccessFile类 该类主要是对文件内容进行操作,可以随机的读取一个文件中指定位置的数据: 但是如果想实现这样的功能,则每个数据的长度应该保持一致:   构造方法:   接受File类 ...

  7. 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载

    主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...

  8. 【Java IO流】RandomAccessFile类的使用

    RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...

  9. 输入和输出--RandomAccessFile类

    RandomAccessFile 类 RandomAccessFile 类既可以读取文件内容,也可以向文件输出数据. RandomAccessFile 类支持 "随机访问" 的方式 ...

随机推荐

  1. AndroidStudio 之 Inter x86 Emulator Accelerator(Haxm installer) - not compatible with windows

  2. UVa 11059 - Maximum Product 最大乘积【暴力】

    题目链接:https://vjudge.net/contest/210334#problem/B 题目大意:Given a sequence of integers S = {S1, S2, . . ...

  3. 014.Docker Harbor+Keepalived+LVS+共享存储高可用架构

    一 多Harbor高可用介绍 共享后端存储是一种比较标准的方案,将多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取.通过前置LB组件,如Keepalived ...

  4. 宝塔Linux面板 5.1正式版永久免费

    宝塔Linux面板 5.1正式版永久免费2017/06/16 2分钟装好面板,一键管理服务器 Linux版请确保纯净系统安装(支持CentOS.Ubuntu.Debian.Fedora),Web端管理 ...

  5. C++ 多继承与虚基类

    转载来自:CSDN insistGoGo  (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class  派生类名:继承方式1 基类名1 ...

  6. Tcp的三次握手,以及原理详解

    http://blog.sina.com.cn/s/blog_6002b97001018fxh.html

  7. 喵哈哈村的魔法考试 Round #8 (Div.2) 题解

    喵哈哈村的美食面馆 签到题,就不停的if就好了. #include<bits/stdc++.h> using namespace std; string name[5]={"ni ...

  8. Sallen-Key Active Butterworth Low Pass Filter Calculator

    RC 2nd Order Passive Low Pass Filter The cut-off frequency of second order low pass filter is given ...

  9. AngularJS中控制器继承

    本篇关注AngularJS中的控制器继承,了解属性和方法是如何被继承的. 嵌套控制器中属性是如何被继承的? ==属性值是字符串 myApp.controller("ParentCtrl&qu ...

  10. HTML5 background-color和background-image问题共用问题

    在HTML5中支持背景图片和背景颜色在一个标签中同时渲染. 一般的需求是为元素指定背景颜色,然后在背景色的商品绘制背景图. 支持:Google,FF,IE9以上浏览器. 基本原则:先设置背景图片,再指 ...