RandomAccessFile简介_动力节点Java学院整理

发布时间 - 2026-01-11 01:14:04    点击率:

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学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# randomaccessfile  # java使用randomaccessfile在文件任意位置写入数据  # Java RandomAccessFile 指定位置实现文件读取与写入  # Java RandomAccessFile的用法详解  # Java使用RandomAccessFile类对文件进行读写  # Java I/O深入学习之File和RandomAccessFile  # Java中IO流 RandomAccessFile类实例详解  # java使用RandomAccessFile类基于指针读写文件实例代码  # Java核心编程之文件随机读写类RandomAccessFile详解  # java文件操作工具类分享(file文件工具类)  # Java最全文件操作实例汇总  # Java RandomAccessFile基本文件操作示例  # 存储设备  # 的是  # 会将  # 相对于  # 能对  # 小编  # 是一个  # 子类  # 在此  # 会在  # 我们可以  # 英文  # 才有  # 给大家  # 不存在  # 都将  # 但它  # 它也  # 并向  # 所占 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  做企业网站制作流程,企业网站制作基本流程有哪些?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何为不同团队 ID 动态生成多个独立按钮  如何在服务器上三步完成建站并提升流量?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Bootstrap整体框架之CSS12栅格系统  深入理解Android中的xmlns:tools属性  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Swift中swift中的switch 语句  php485函数参数是什么意思_php485各参数详细说明【介绍】  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何用好域名打造高点击率的自主建站?  如何在局域网内绑定自建网站域名?  音响网站制作视频教程,隆霸音响官方网站?  如何用已有域名快速搭建网站?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  新三国志曹操传主线渭水交兵攻略  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  动图在线制作网站有哪些,滑动动图图集怎么做?  EditPlus中的正则表达式实战(5)  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  三星网站视频制作教程下载,三星w23网页如何全屏?  网站制作壁纸教程视频,电脑壁纸网站?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  微信小程序制作网站有哪些,微信小程序需要做网站吗?  开心动漫网站制作软件下载,十分开心动画为何停播?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何在Windows虚拟主机上快速搭建网站?  iOS验证手机号的正则表达式  英语简历制作免费网站推荐,如何将简历翻译成英文?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何在云服务器上快速搭建个人网站?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  教你用AI将一段旋律扩展成一首完整的曲子  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何自定义建站之星模板颜色并下载新样式?