功能简介


我们之前一直说流顺序的,不能随机访问,的确之前说的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 进行深入研究




[二十五]JavaIO之RandomAccessFile的更多相关文章

  1. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

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

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

  3. WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇]

    原文:WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇] 在[WS标准篇]中我花了很大的篇幅介绍了WS-MEX以及与它相关的WS规范:WS-Policy.WS-Tra ...

  4. Bootstrap入门(二十五)JS插件2:过渡效果

    Bootstrap入门(二十五)JS插件2:过渡效果 对于简单的过渡效果,只需将 transition.js 和其它 JS 文件一起引入即可.如果你使用的是编译(或压缩)版的bootstrap.js  ...

  5. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  6. JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

    JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇 ...

  7. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  8. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  9. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

随机推荐

  1. BZOJ 3864

    dp of dp 我就是来贴个代码 #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a ...

  2. TortoiseGit的ssh key和Git的ssh key

    情景模拟: 你使用Git+TortoiseGit对项目进行版本控制,本地库(自己电脑建立的.git)与远程库(如GitLab上建立)通信需要使用ssh验证,你用git生成公钥并保存到了Gitlab上, ...

  3. 小白学习随笔the first week

    The First Week 一.计算机基础 1.软件(应用程序) 2.解释器/编译器 - 解释型语言:将代码每一行传递给计算机一行,常用编程语言python,PHP,Ruby. - 编译型语言:将代 ...

  4. 将欢迎消息添加到PeopleSoft主页--登录事件

    以下是如何为PeopleSoft应用程序设置Signon事件消息. 导航到PeopleTools>实用程序>管理> SignOn事件消息 在此页面上,您将看到当前处于活动状态或过去处 ...

  5. 浏览器url地址殊字符转义编码

    网址URL中特殊字符转义编码字符    -    URL编码值 空格    -    %20"          -    %22#         -    %23%        -   ...

  6. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  7. DHCP工作原理简析

    引言 DHCP是网络体系结构中应用层的一个重要协议,它可以帮助我们对要连接到互联网的计算机进行IP地址等信息的配置.本文从DHCP的原理出发,就DHCP的工作过程 进行详细的探讨. 主要报文 发现报文 ...

  8. [LeetCode] New 21 Game 新二十一点游戏

    Alice plays the following game, loosely based on the card game "21". Alice starts with 0 p ...

  9. MySQL表添加自增列

    mysql> create table zc_test2(id int); Query OK, rows affected (1.37 sec) mysql),(),(),(),(); Quer ...

  10. React Native 断点调试 跨域资源加载出错问题的原因分析

    写在前面 ————如果从头开始看还没解决,试试文章最后的绝招 闲来无事,折腾了一下React Native,相比之前,开发体验好了不少.但在真机断点调试那里遇到了跨域资源加载出错的问题,一番探索总算解 ...