Java IO(二)——RandomAccessFile

一、RandomAccessFile

RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile类支持"随机访问"方式,可以跳转到文件的任意位置处读写数据。要访问一个文件的时候,不想把文件从头读到尾,而是希望像访问一个数据库一样地访问一个文本文件,使用RandomAccessFile类是最佳选择。

RandomAccessFile对象类中有个位置指示器,指向当前读写处的位置,当读写n个字节后,文件指示器将指向这n个字节后的下一个字节处。刚打开文件时,文件指示器指向文件的开头处,可以移动文件指示器到新的位置,随后的读写将从新的位置开始。

RandomAccessFile类在文件随机(相对于顺序)读取时有很大的优势,但该类仅限于操作文件,不能访问其他得IO设备,如网络、内存映像等。

二、RandomAccessFile构造方法

RandomAccessFile类为用户提供了两种构造方法:

1、RandomAccessFile(File file, String mode)

2、RandomAccessFile(String name, String mode)

其实第二种构造方法也是new一个File出来再调用第一种构造方法,建议使用第一种构造方法,因为第一篇文章就说了File是IO的基础,有一个File不仅仅可以通过RandomAccessFile对文件进行操作,也可以通过File对象对文件进行操作。至于mode,Java给开发者提供了四种mode:

模    式作    用
r表示以只读方式打开,调用结果对象的任何write方法都将导致抛出IOException
rw打开以便读取和写入,如果该文件尚不存在,则尝试创建该文件
rws打开以便读取和写入,相对于"rw",还要求对文件内容或元数据的每个更新都同步写入到底层存储设备
rwd打开以便读取和写入,相对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备

 

 

 

 

 

注意第二点"rw"模式,对rw模式的解释意味着Java并不强求指定的路径下一定存在某个文件,假如文件不存在,会自动创建。

三、RandomAccessFile中的方法

RandomAccessFile中有如下一些常用方法:

方    法作    用
void close()重要,关闭此随机访问文件流并释放与该流关联的所有系统资源
FileChannel getChannel()返回与此文件关联的唯一FileChannel对象,NIO用到
long getFilePointer()返回此文件中的当前偏移量
long length()返回此文件的长度
int read()从此文件中读取一个数据字节
int read(byte[] b)将最多b.length个数据字节从此文件读入byte数组,返回读入的总字节数,如果由于已经达到文件末尾而不再有数据,则返回-1。在至少一个输入字节可用前,此方法一直阻塞
int read(byte[] b, int off, int len)将最多len个数据字节从此文件的指定初始偏移量off读入byte数组
boolean readBoolean()从此文件读取一个boolean,其余readByte()、readChar()、readDouble()等类似
String readLine()从此文件读取文本的下一行
void seek(long pos)重要,设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作
int skipBytes(int n)重要,尝试跳过输入的n个字节以丢弃跳过的字节,返回跳过的字节数
void write(byte[] b)将b.length个字节从指定byte数组写入到此文件中
void write(byte[] b, int off, int len)将len个字节从指定byte数组写入到此文件,并从偏移量off处开始
void write(int b)向此文件写入指定的字节
void writeBoolean(boolean v)按单字节值将boolean写入该文件,其余writeByte(int v)、writeBytes(String s)、writeChar(int v)等都类似

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、RandomAccessFile使用实例

先定义一个实体类:

复制代码
package com.demo.entity;public class Employee {private String name;private int age;private final static int LEN = 8;public Employee() {}public Employee(String name, int age) {if (name.length() > LEN) {name = name.substring(0, 8);} else {while (name.length() < LEN) {name = name + "\u0000";}}this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
复制代码

第一部分,写文件,该文件在路径下并没有,所以Java会自动帮我们创建:

复制代码
/*** 写文件*/
@Test
public void writeFile() throws IOException{Employee e1 = new Employee("zhangsan", 23);Employee e2 = new Employee("lisi", 24);Employee e3 = new Employee("wangwu", 25);RandomAccessFile raf0 = new RandomAccessFile("D:/Files/employee.txt", "rw");raf0.writeBytes(e1.getName());raf0.writeInt(e1.getAge());raf0.writeBytes(e2.getName());raf0.writeInt(e2.getAge());raf0.writeBytes(e3.getName());raf0.writeInt(e3.getAge());raf0.close();
}
复制代码

文件创建好了,D盘下的Files文件夹也有该文件了,所以读取一下,这里使用了一些小技巧来演示seek方法和skipBytes方法:

复制代码
/*** 读文件*/
@Test
public void ReadFile() throws IOException{RandomAccessFile raf1 = new RandomAccessFile("D:/Files/employee.txt", "r");int len = 8;raf1.skipBytes(12); // 跳过第一个员工的信息,其姓名8字节,年龄4字节System.out.println("第二个员工的信息:");String str = "";for (int i = 0; i < len; i++){str = str + (char)raf1.readByte();}System.out.println("name:" + str);System.out.println("age:" + raf1.readInt());System.out.println("第一个员工的信息:");raf1.seek(0);str = "";for (int i = 0; i < len; i++){str = str + (char)raf1.readByte();}System.out.println("name:" + str);System.out.println("age:" + raf1.readInt());System.out.println("第三个员工的信息:");raf1.skipBytes(12); // 跳过第二个员工的信息str = "";for (int i = 0; i < len; i++){str = str + (char)raf1.readByte();}System.out.println("name:" + str.trim());System.out.println("age:" + raf1.readInt());raf1.close();
}
复制代码

看一下运行结果:

复制代码
第二个员工的信息:
name:lisi
age:24
第一个员工的信息:
name:zhangsan
age:23
第三个员工的信息:
name:wangwu
age:25
复制代码

可能有人奇怪,"zhangsan"加上一个int跳过12个字节可以理解,但是"lisi"、"wangwu"为什么加上int要跳过12个字节呢?明明"lisi"只有4个字节,"wangwu"只有6个字节啊。这个就涉及到一个"字节对齐"的问题了,有兴趣的可以了解一下。另外,再说一下,RandomAccessFile使用完一定要及时close()。

转载于:https://www.cnblogs.com/zhuyuewei/p/7263655.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon select_shape_xld按区域大小描绘xld

常用与对xld进行以面积、长、宽进行XLD的选择操作。 select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : ) XLD&#xff1a;需要选择的xld SelectedXLD:选择后的xld Features:面积、长、高等 Operation&#xff1a;and、or等 Min&#xff1a;最小值门…

工业三防手持终端如何选

物联宇手持终端作为工业级的数据采集器&#xff0c;目前[]()已广泛应用在物流快递、生产制造、零售、医疗、公共事业等领域。由于工业环境的复杂性&#xff0c;手持终端在恶劣的环境下作业&#xff0c;在性能、稳定性、电池耐用性上的要求都较高&#xff0c;同时还必须采用一些…

centos7 安装python3

1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安装Python 然后使用命令 which python 查看一下Python可执行文件的位置 可见执行文件在/usr/bin/ 目录下&#xff0c;切换到该…

centos svn 的搭建

一. SVN 简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏…

halcon边缘提取和检测常用方法

转自&#xff1a;http://blog.csdn.net/Bob_qiuxu/article/details/46924969 一、边缘提取 1、设置ROI兴趣区域 2、快速二值化&#xff0c;并连接相邻区域。 这样做的目的是进一步减少目标区域&#xff0c;通过二值化将目标区域大概轮廓提取出来 3、提取最接近目标区域的轮廓…

oracle sqlplus常用命令

转自&#xff1a;https://www.cnblogs.com/wdx8927304/p/7927613.html 一、sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1)、sys用户是超级用户&#xff0c;具有最高权限&#xff0c;具有sysdba角色&#xff0c;有create database的权限&#xff0c;该用户默…

使用css绘制小三角

<div style"width:0;height:0;overflow: hidden;border-top:4px solid transparent;border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid red; "></div>转载于:https://www.cnblogs.com/boonook/p/8570442.h…

C#与halcon联合开发——内存溢出

1.对所以的局部零时变量HObject类的使用前后都加Dispose(); 2.对全局的HObject类变量进行如下定义 HObject liveImage null;HObject ExpGet_liveImage(){return liveImage;}void ExpSet_liveImage(HObject obj){if (liveImage ! null)liveImage.Dispose();liveImage obj.Cop…

点击跳转到QQ聊天界面

<!--//需要添加好友验证--><a href"tencent://message/?uinQQ号码&Site&Menuyes"><img src"需要点击的图片" width"80"/></a><!--不需要添加好友验证--><a href"tencent://message/?Menuyes&am…

学习React的一知半解

① 初探 HMTL的渲染过程 ​ 这个结构化文本就是 HTML 文本&#xff0c; HTML 中的每个元素都对应 DOM中某个节点&#xff0c;这样&#xff0c;因为 HTML 元素的逐级包含关系&#xff0c; DOM 节点自然就构成了一个树形结构&#xff0c;称为 DOM 树 。 ​ 浏览器为了渲染 HTML 格…

DataTable 转为ListT集合

public static List<T> HubbleTableToList<T>(this DataTable dt) where T:Class{List<T> _list new List<T>();if (dt null) return _list;T model;foreach (DataRow dr in dt.Rows)//进行循环dataTable行数据{model Activator.CreateInstance<…

工业相机与镜头分辨率匹配

// 转自 奥普特讲述工业相机与镜头分辨率匹配的技术方案 随着机器视觉行业的发展&#xff0c;为了更好的满足广大客户选配合适镜头的需求&#xff0c;奥普特自动化科技有限公司为您简述工业相机如何选配合适的镜头&#xff0c;以及在相机与镜头的分辨率匹配方面的技术方案。 …

微信分享

<?php /*** Description of WxShare*微信分享* author xinjun*/ namespace Controller\Wx;use Controller\Home\HomeBase; use Model\Wx\UserModel; use Model\Wx\TokenModel; use Framework\Net\Request;class WxShare extends HomeBase {public function __construct(){p…

工业相机的靶面大小

在机器视觉中&#xff0c;工业相机是一种比较重要的配件。而在工业相机中&#xff0c;图像传感器又是最最关键核心的东西。而图像传感器的靶面的大小&#xff0c;往往直接关系到成像的质量。通常来讲&#xff0c;图像的成像质量与像素的大小成正比。这也就意味着&#xff0c;同…

软件建模——第3章 项目前期

3.1 项目前期的主要工作 3.1.1 现状分析 1.硬件分析 2.软件分析 3.1.2 需求收集 3.1.3 粗略设计 1.体系结构设计 2.硬件&#xff08;网络&#xff09;设计 3.应用系统设计 4.安全设计 5.配套设计 3.1.4 可行性分析 3.2 结构化的项目前期实例 3.2.1 组织分析&#xff08;自动化…

echarts_部分图表配置_图表click事件

额。。当然其他事件都是支持的&#xff0c;此文仅以click做简单介绍&#xff1a; 请点击“柱子”。。。 官方介绍&#xff1a;http://echarts.baidu.com/tutorial.html#ECharts%20%E4%B8%AD%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%92%8C%E8%A1%8C%E4%B8%BA 1 function bottom_z (thisI…

mysql 5.7.25 的安装与 安装错误修改 适用于5.7解压版

1&#xff0c;根据自己的需求去官网下载 2.解压到自己喜欢的路径 其中date 和 my.ini 在5.7后面的版本 解压后是没有的&#xff0c;需要自己配置。 可以自己创建my.ini文件 &#xff0c;但是不能自己创建date文件夹。 其中my.ini文件的配置如下&#xff08;如果报错要将目录文件…

数据结构 最长公共子序列问题

例题: 51nod 1006 解析1:http://blog.csdn.net/yysdsyl/article/details/4226630/ 解析2:http://blog.csdn.net/hrn1216/article/details/51534607 转载于:https://www.cnblogs.com/wenbo4399/p/8594586.html

解除服务器端口号占用及服务器端口号的修改

这几天因为面试的原因把SSH的东西重新巩固下&#xff0c;所以用的服务器是Tomcat。但是因为前一个项目用的服务器是Jboss&#xff0c;项目一期迭代完成&#xff0c;转交测试组进行测试&#xff0c;提了很多bug&#xff0c;所以当改bug的时候发现我Jboss的服务器可以允许&#x…