RandomAccessFile简介_动力节点Java学院整理
作者:mrr 发布时间:2021-12-18 09:02:15
RandomAccessFile
RandomAccessFile 是随机访问文件(包括读/写)的类。它支持对文件随机访问的读取和写入,即我们可以从指定的位置读取/写入文件数据。
需要注意的是,RandomAccessFile 虽然属于java.io包,但它不是InputStream或者OutputStream的子类;它也不同于FileInputStream和FileOutputStream。 FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;但是,RandomAccessFile 同时支持文件的读和写,并且它支持随机访问。
RandomAccessFile 函数列表
RandomAccessFile(File file, String mode)
RandomAccessFile(String fileName, String mode)
void close()
synchronized final FileChannel getChannel()
final FileDescriptor getFD()
long getFilePointer()
long length()
int read(byte[] buffer, int byteOffset, int byteCount)
int read(byte[] buffer)
int read()
final boolean readBoolean()
final byte readByte()
final char readChar()
final double readDouble()
final float readFloat()
final void readFully(byte[] dst)
final void readFully(byte[] dst, int offset, int byteCount)
final int readInt()
final String readLine()
final long readLong()
final short readShort()
final String readUTF()
final int readUnsignedByte()
final int readUnsignedShort()
void seek(long offset)
void setLength(long newLength)
int skipBytes(int count)
void write(int oneByte)
void write(byte[] buffer, int byteOffset, int byteCount)
void write(byte[] buffer)
final void writeBoolean(boolean val)
final void writeByte(int val)
final void writeBytes(String str)
final void writeChar(int val)
final void writeChars(String str)
final void writeDouble(double val)
final void writeFloat(float val)
final void writeInt(int val)
final void writeLong(long val)
final void writeShort(int val)
final void writeUTF(String str)
1. RandomAccessFile 模式说明
RandomAccessFile共有4种模式:"r", "rw", "rws"和"rwd"。
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。
"rws" 打开以便读取和写入。相对于 "rw","rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。
"rwd" 打开以便读取和写入,相对于 "rw","rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备。
说明:
(01) 什么是“元数据”,即metadata?
英文解释如下:
The definition of metadata is "data about other data." With a file system, the data is contained in its files and directories, and the metadata tracks information about each of these objects: Is it a regular file, a directory, or a link? What is its size, creation date, last modified date, file owner, group owner, and access permissions?
大致意思是:
metadata是“关于数据的数据”。在文件系统中,数据被包含在文件和文件夹中;metadata信息包括:“数据是一个文件,一个目录还是一个链接”,“数据的创建时间(简称ctime)”,“最后一次修改时间(简称mtime)”,“数据拥有者”,“数据拥有群组”,“访问权限”等等。
(02) "rw", "rws", "rwd" 的区别。
当操作的文件是存储在本地的基础存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。
当模式是 "rws" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,都会将这些改变同步到基础存储设备上。
当模式是 "rwd" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]”时,都会将这些改变同步到基础存储设备上。
当模式是 "rw" 并且 操作的是基础存储设备上的文件;那么,关闭文件时,会将“文件内容的修改”同步到基础存储设备上。至于,“更改文件内容”时,是否会立即同步,取决于系统底层实现。
2. 演示程序
源码如下:
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintStream;;
import java.io.RandomAccessFile;
import java.io.IOException;
/**
* RandomAccessFile 测试程序
*
* 运行结果(输出如下):
* c1=a
* c2=b
* buf=
*
* 此外,
* (01) 在源文件所在目录生成了file.txt。
* (02) 注意RandomAccessFile写入boolean, byte, char, int,所占的字符个数。
*
*
*/
public class RandomAccessFileTest {
private static final String FileName = "file.txt";
public static void main(String[] args) {
// 若文件“file.txt”存在,则删除该文件。
File file = new File(FileName);
if (file.exists())
file.delete();
testCreateWrite();
testAppendWrite();
testRead();
}
/**
* 若“file.txt”不存在的话,则新建文件,并向文件中写入内容
*/
private static void testCreateWrite() {
try {
// 创建文件“file.txt”对应File对象
File file = new File(FileName);
// 创建文件“file.txt”对应的RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(file, "rw");
// 向“文件中”写入个字母+回车
raf.writeChars("abcdefghijklmnopqrstuvwxyz\n");
// 向“文件中”写入""+回车
raf.writeChars("\n");
raf.close();
} catch(IOException e) {
e.printStackTrace();
}
}
/**
* 向文件末尾追加内容
*/
private static void testAppendWrite() {
try {
// 创建文件“file.txt”对应File对象
File file = new File(FileName);
// 创建文件“file.txt”对应的RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(file, "rw");
// 获取文件长度
long fileLen = raf.length();
// 将位置定位到“文件末尾”
raf.seek(fileLen);
// 以下向raf文件中写数据
raf.writeBoolean(true); // 占个字节
raf.writeByte(x); // 占个字节
raf.writeChar('a'); // 占个字节
raf.writeShort(xcc); // 占个字节
raf.writeInt(x); // 占个字节
raf.writeLong(xL); // 占个字节
raf.writeFloat(.f); // 占个字节
raf.writeDouble(.);// 占个字节
raf.writeUTF("UTF严"); // UTF-格式写入
raf.writeChar('\n'); // 占个字符。“换行符”
raf.close();
} catch(IOException e) {
e.printStackTrace();
}
}
/**
* 通过RandomAccessFile读取文件
*/
private static void testRead() {
try {
// 创建文件“file.txt”对应File对象
File file = new File(FileName);
// 创建文件“file.txt”对应的RandomAccessFile对象,以只读方式打开
RandomAccessFile raf = new RandomAccessFile(file, "r");
// 读取一个字符
char c1 = raf.readChar();
System.out.println("c1="+c1);
// 读取一个字符
char c2 = raf.readChar();
System.out.println("c2="+c2);
// 跳过54个字节。
raf.seek(54);
// 测试read(byte[] buffer, int byteOffset, int byteCount)
byte[] buf = new byte[20];
raf.read(buf, , buf.length);
System.out.println("buf="+(new String(buf)));
raf.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
运行结果:
c1=a
c2=b
buf=9876543210
结果说明:
程序会在源文件所在目录生成file.txt;file.txt的内容如下:
file.txt对应的16进制内容如下:
以上所述是小编给大家介绍的RandomAccessFile简介_动力节点Java学院整理网站的支持!
猜你喜欢
- 上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复。说到普通消息,那么什么是微信公众号所定义的普通消息呢,
- 在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例
- 循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。Java提供了while条件循环。它的基本用法是:whi
- 1. 继承1. 子类继承了父类,获得父类的全部Field和方法。子类Student类继承父类,将可以获得父类的全部Field和方法publi
- 1、UUID类库UUID 根据时间戳实现自动无重复字符串定义// 获取UUIDpublic static UUID randomUUID()
- 今天使用mybatis-plus自动填充插入和更新时间有8小时时差后来发现只需要修改一下mybaits连接的url即可原先我是用的datas
- Java float和double精度范围大小要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:举
- 入门Springboot项目创建在IDEA中创建即可。注意点:1、所有文件都需要放在 :Application文件的同级或下级目录中2、ap
- 欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建
- 项目需求:根据年级下拉框的变化使得科目下拉框绑定次年级下对应有的值我们用三层架构的模式来实现1.我们想和数据库交互,我们首先得来先解决DAL
- 随着移动互联网的快速发展,它已经和我们的生活息息相关了,在公交地铁里面都能看到很多人的人低头看着自己的手机屏幕,从此“低头族”一词就产生了,
- 针对XML文件的操作是C#程序设计中非常常见的功能。本文即以实例展示了C#操作XML文件的几个常见的示例。具体如下:1.返回节点下标publ
- 前言本次示例代码的文件结构如下图所示。1. 导入依赖坐标在 order-service 的 pom.xml 文件中导入 Feign 的依赖坐
- Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下:LockPatternView.javapackage com.
- 在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我
- Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。Memento模式相
- c# label的内容显示不全,需要设置如下属性即可:1、将Lable的font属性的字体改成宋体;2、将AutoSize属性改成true;
- MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断
- c++优先队列(priority_queue)用法详解普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元
- 一、引言在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文