专栏首页noteless[二十五]JavaIO之RandomAccessFile

[二十五]JavaIO之RandomAccessFile

功能简介

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [零] JavaIO入门简介 程序设计语言 为什么需要IO库

    本文旨在引申出来Java IO的概念含义,作为学习JavaIO一个起步的了解知识点

    noteless
  • ubuntu 修改网卡名称 更改设备网卡名称 修改eno16777736为eth0 ubuntu 15.10网卡名称为eno16777736

    看到这个地方了没,有提示信息的,想要改变这个文件,记得运行 update-grub使之生效

    noteless
  • 修改设置notepad++默认保存文件格式

    在使用notepad++新建文件保存后,有的时候会有一个all type 然后没有文件扩展名,很不方便

    noteless
  • 你绝对想不到R文件找不到(cannot resolve symbol R)的原因

    最近在项目开发中 Android Studio 的 R 文件突然找不到了。IDE 中出现了以下提示

    阳仔
  • 多基因风险评分3

    PRSice是当前比较流行的多基因风险评分工具,它主要是用R语言编写的,运行速度快,可以高通量处理大数据。它既有Linux版本,也有Windows版本,由于我们...

    生信与临床
  • Python 文件I/O

    Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作。

    Python知识大全
  • Python全栈开发之文件操作

    在终端/资源管理器、 中可以执行常规的文件/目录管理操作 ,如果希望通过代码来实现,需要导入os模块

    py3study
  • 小朋友学Python(17):文件

    Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 一、打开和关闭文件 例1 (1)创建名为test...

    海天一树
  • php面试笔记(7)-php基础知识-文件及目录处理考点

    在面试中,考官往往喜欢基础扎实的面试者,而文件及目录处理相关的考点,往往是大家容易忽视的一个点,今天冷月就来帮各位小伙伴们梳理一下,在面试中文件及目录处理相关的...

    学长冷月
  • python基础学习8----文件基本操

      1. 'r': 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

    py3study

扫码关注云+社区

领取腾讯云代金券