资讯专栏INFORMATION COLUMN

Java IO : RandomAccessFile

miracledan / 3119人阅读

摘要:,除了具有的特点外,这个模式要求对文件内容和文件元数据的每一个更新都会同步更新至底层的物理存储。

RandomAccessFile概览

对文件的读取,既可以按顺序,也可以以任意顺序来读取。
RandomAccessFile提供这样一种功能。其保存一个指向当前文件位置的指针,可以通过调整指针的位置,读取一个文件中任意的内容。通过一段简单的代码来有个大体的认识:

RandomAccessFile raf = new RandomAccessFile("abc.log", "r");
int logIndex = 10;
raf.seek(logIndex);
//接下来通过raf进行文件操作
构造器

RandomAccessFile提供了两个构造器

RandomAccessFile(File file, String mode)
RandomAccessFile(String path, String mode)
模式

通过RandomAccessFile打开一个文件需要指定打开的模式,构造参数中的mode有四种模式可以选择:

"r",以只读的方式打开一个已存在的文件,不可对文件进行写操作。

"rw",以读写的方式打开一个已存在的文件,若文件不存在,则创建一个,可对该文件进行读写操作。

"rwd",除了具有"rw"的特点外,这个模式要求对文件内容的每一个更新都会同步更新至底层的物理存储。

"rws",除了具有"rw"的特点外,这个模式要求对文件内容和文件元数据的每一个更新都会同步更新至底层的物理存储。

文件的元数据并非指文件的内容本身,文件的大小以及文件的最后修改时间等等算是元数据的一部分

显然,如果指定了rwdrws模式,那么对于文件的操作将会相对比较慢一些。

读写

RandomAccessFile内部维护了一个指针,指向当前读取或者写入的位置,当通过RandomAccessFile打开一个已存在的文件或者创建一个新文件时,指针自动指向下标为0的位置。进行写入操作时,如果指针已经指向文件的末尾,那么文件的大小将会被扩大。

当需要进行读取或者写入时,首先通过void seek(long pos)将文件的指针指向你想要读取或写入的位置,读取时有以下常用的方法可以进行读取:

int read() //读取下一个字节

int read(byte[] b) //将读取的字节装入b数组中

char readChar() //读取两个字节,并将其转型为char类型

int readInt() //读取四个字节,并将其转型为int类型

写入时有以下方法:

void write(int b) //将b的低八位写入

void writeChars(String s) //将字符串s所代表的字节写入

void write(byte[] b) //将字节数组b写入

void writeInt(int i) //写入4个字节的i

除了读取写入的方法外,setLength(long newLength)方法可以设置文件的大小,如果newLength小于当前文件大小,那么文件将会被截肢,反之,文件将会被扩大到newLength。

FileDescriptor

值得注意的是,RandomAccessFile提供了一个FileDescriptor getFD()方法获取文件所对应的文件描述符对象,文件描述符代表是一种平台独立的文件描述结构,通过这个描述符可以对文件进行一些特殊的操作。

FileDescriptor定义了sync()方法,与之前提到的"rwd"和"rwd"一样,sync方法用来告诉操作系统将缓冲区的内容全部刷到物理的存储上。如果没有指定rwd或者rws模式,那么对文件的写入将会暂时存储于操作系统层面的缓冲区里面,当缓冲区满时,操作系统才会将内容刷至物理磁盘,通过sync()方式可以让操作系统对每一次写入操作都同步刷新至物理存储中,以下为一个例子:

RandomAccessFile raf = new RandomAccessFile("abc.log", "rw");
//这里的模式不是rwd或者rws
FileDescriptor fd = raf.getFD();
raf.write(...);
// 通过fd的sync方法,可以让写入操作同步地刷新至物理存储
fd.sync();
raf.close();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65342.html

相关文章

  • Java IO (三) 读取其他进程数据,RandomAccessFile,序列化和反序列化

    摘要:虚拟机读取其他进程的数据对象的方法可以运行平台上的其他程序该方法产生一个对象对象代表由该程序启动启动的子进程类提供如下三个方法用于和其子进程通信获取子进程的错误流获取子进程的输入流获取子进程的输出流这里的输入流输出流容易混淆从程序的角度思考 Java虚拟机读取其他进程的数据 Runtime对象的exec方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象...

    zhangfaliang 评论0 收藏0
  • 怎么用Java从网上下载一个视频下来

    摘要:用的流从网上下载一个视频原理就是用对象与目标地址建立一个链接,用流的方式从这个链接上把视频的二进制数据读取下载然后再写入本地文件。然后循环依次写入缓存的大小,直至结束。 用Java的IO流从网上下载一个视频 原理:就是用URL对象与目标地址建立一个链接,用IO流的方式从这个链接上把视频的二进制数据读取下载然后再写入本地文件。 因为小弟比较菜的缘故,不会下载那些加了密的视频链接,这里我就...

    warmcheng 评论0 收藏0
  • Java 输入/输出 I/O流 RandomAccessFile

    摘要:当使用节点流进行输入输出时,程序直接连接到实际的数据源,和时间的输入输出节点连接处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能,处理流也被称为高级流。 文件的编码 文本文件就是字节序列,可以是任意编码形式。在中文操作系统上直接创建文本文件,则该文本文件只能识别ANSI编码,其他编码方式会产生乱码 package imooc.io; import java...

    Eirunye 评论0 收藏0
  • Java NIO 之 Channel(通道)

    摘要:通道可以异步读写。使用的方法读取数据创建一个读数据缓冲区对象从通道中读取数据使用的方法写入数据创建一个写数据缓冲区对象写入数据关闭完成使用后,您必须关闭它。五提供了一种被称为的新功能,也称为本地矢量。功能是通道提供的并不是。 历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集...

    piglei 评论0 收藏0
  • 关于JAVA中顺序IO的基本操作

    摘要:关于中顺序的基本操作关于中顺序的基本操作写在前面最近研究一下中的顺序,在网络上找了一会儿,发现少有详细的介绍,顾此在此处说说顺序,才学疏浅,如有不对,望赐教。上述代码中标记位置中,返回下一次操作时的位置。关于JAVA中顺序IO的基本操作 写在前面 最近研究一下JAVA中的顺序IO,在网络上找了一会儿,发现少有详细的介绍,顾此在此处说说顺序IO,才学疏浅,如有不对,望赐...

    EscapedDog 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<