功能简介

我们之前一直说流顺序的,不能随机访问,的确之前说的IO体系的确如此
但是 RandomAccessFile自成一派
此类的实例支持对随机访问文件的读取和写入
我们之前介绍过DataOutput 和DataInput
这是两个接口,约定了从基本数据类型与字节的操作交互方式
所以,我们从类层级结构也可以想得到
他必然是提供了便捷的读写基本数据类型的方法

构造方法


既然是文件随机读写,自然需要文件
内部维护了一个文件描述符 fd
还有文件的读写方式 rw 明明只有两个构造方法 path的注释还说,如果通过文件描述符创建,path为null
此处提醒,有些注释或者API文档,他可能没及时删除,可能没及时修改,如果有的地方明显不太对劲
不要非去找证据证明他是对的,他可能就是错的,就看代码就好了,JDK的源码也是人写的,不是神丢向人间的 构造方法需要文件,以及读写模式这两个信息来打开文件

mode的字符串形式有如下几种,如果不对,可以看得到,如果这几种不是 imode为-1 小于0 直接抛异常了

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 
"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 

构造方法中会打开文件
文件的打开使用的是本地方法

RandomAccessFile逻辑原理

RandomAccessFile仅仅只能用于文件
RandomAccessFile 对于文件的操纵,就好像是对于一个巨大的数组进行访问一样
存在着一种类似下标索引的东西,可以叫做文件指针
至于到底怎么抽象成这个模型的,底层的实现我们不去关注,我们只关注我们看起来RandomAccessFile的样子就好

如上图所示,这就是RandomAccessFile访问文件的模型

可以返回这个文件的文件描述符     FileDescriptor getFD()
可以返回当前的文件指针               native long getFilePointer()
可以返回文件的长度                     native long length()
还可以设置文件的长度                  native void setLength(long newLength)
设置读写偏移量位置                     void seek(long pos) setLength 为什么还能设置文件长度? 你可以理解为这是一个"动态数组"!!

假设你想要设置为newLength  长度
1. 如果这个长度小于 实际长度(length方法返回的值),  文件被截断,并且如果getFilePointer 大于newLength ,那么它将变成newLength   
2. 如果 newLength大于 实际长度(length方法返回的值),则该文件将被扩展   在此情况下,未定义文件扩展部分的内容。
seek方法设置的偏移量,下一次的读写将从这个位置开始
偏移量的设置可能会超出文件末尾,这并不会改变什么
但是一旦你在这个超出文件末尾的偏移量位置写入数据,长度将会改变

也正是此处的这几个方法提供了随机访问的能力

方法简介

RandomAccessFile的神秘之处就在于它的逻辑原理
那就是呈现给我们的操作方式就像操作数组一样
他根本的读写方法,全都是本地方法
对于其他的readXXX 以及writeXXX方法
则是借助于基本的读写方法的情况下, 提供了对基本数据类型的支持
这一部分就相当于把DataInputStream和DataOutputStream结合起来了
而且还能够随机存取
不再对readXXX和 writeXXX方法进行介绍
如有兴趣可以对DataInput  DataOutput  以及 DataInputStream和DataOutputStream 进行深入研究

转载于:https://www.cnblogs.com/noteless/p/9647037.html

[二十五]JavaIO之RandomAccessFile相关推荐

  1. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  2. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  3. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  4. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  5. 二十五、求单点的最短路径

    二十五.求单点的最短路径 文章目录 二十五.求单点的最短路径 题目描述 解题思路 上机代码 题目描述 求从指定源点出发到各个顶点的最短路径. **假设:**图中结点名均为单个互不相同的字母,权值均&g ...

  6. Python之精心整理的二十五个文本提取及NLP相关的处理案例

    一.提取 PDF 内容 # pip install PyPDF2 安装 PyPDF2 import PyPDF2 from PyPDF2 import PdfFileReader# Creating ...

  7. SAP UI5 初学者教程之二十五 - 使用代理服务器解决 SAP UI5 应用访问远端 OData 服务的跨域问题试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  8. FreeSql (二十五)延时加载

    FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...

  9. [转载]Windowsnbsp;Servernbsp;2008nbsp;R2nbsp;之二十五ADnbsp;RMS信任策略

    原文地址:Windows Server 2008 R2 之二十五AD RMS信任策略作者:从心开始 可以通过添加信任策略,让 AD RMS 可以处理由不同的 AD RMS 群集进行权限保护的内容的授权 ...

最新文章

  1. 20年研发管理经验谈(三)
  2. Python:numpy库中的一些函数简介、使用方法之详细攻略
  3. 我的天,强化学习还能用在自动驾驶领域?
  4. COMBO--组合拳打穿回调地狱~
  5. P1445-[Violet]樱花【数学】
  6. 数据库图书管理建表与修改表
  7. java共同方法_java-现有公共方法的NoSuchMethodError
  8. 新手如何使用docker搭建web服务环境
  9. 一文了解中央银行数字货币CBDC的总体框架
  10. APP响应时间和响应速度测试
  11. 计算机上数字代表那个音符,音乐简谱中数字上的点表示什么,别说你不知道哦 ^-^...
  12. 如何用计算机算工资,个人工资计算器避税
  13. WPF 做的时钟表盘 加上天气预报
  14. 作业4—文法和语言总结与梳理
  15. MSCL超级工具类(C#),开发人员必备,开发利器
  16. 寻找复杂背景下的物体轮廓 (从禾路的博客园整理学习)
  17. uboot环境下mmc操作_android uboot中的mmc命令
  18. rar文件解压后可以删除吗?rar文件删除后怎么恢复?
  19. 安卓中图片占用内存大小分析
  20. 2021年安全员-C证(上海市)考试APP及安全员-C证(上海市)新版试题

热门文章

  1. SAP WMSD集成之Copy WM Quantity – Copy WM qty as delivery qty into delivery
  2. 逃离 AI 赛道的投资人:做局失利、破局无力
  3. Yann LeCun“隔纸对话”黄铁军:图灵机上的深度学习能模拟世界吗?
  4. ERICA:提升预训练语言模型实体与关系理解的统一框架
  5. 机器学习与统计学的争论,有意义吗?
  6. AI 系统可帮助医生发现脑动脉瘤
  7. 机器学习系列 5:特征缩放
  8. TensorFlow什么的都弱爆了,强者只用Numpy搭建神经网络
  9. (已解决)AttributeError: ‘PrecisionRecallDisplay‘ has no attribute ‘from_predictions‘以及查看sklearn版本
  10. Anaconda,pytorch如何安装中文版的BERT和使用