首页 > 编程语言 >Java随机读写文件

Java随机读写文件

时间:2024-03-23 11:33:49浏览次数:31  
标签:文件 Java int 读写 位置 写入 RandomAccessFile 随机 void

目录

1. 构造方法

2. 文件指针

3. 读写操作

4. 应用示例


       文件输入输出流类(FileInputStream和FileOutputStream)实现了对磁盘文件的顺序读写,然而在实际的应用中,经常需要在文件的任意位置读或写数据,并且要求同时进行读和写操作。为此,Java还提供了一个功能更强大、使用更方便的RandomAccessFile类,该类可以实现对文件的随机读写。RandomAccessFile类定义在java.io包中,它与InputStream和OutputStream类在一个层次,是Object类的直接子类。RandomAccessFile类支持文件任意位置的读取而不只是顺序读取。

1. 构造方法

       RandomAccessFile类的构造方法如下:

RandomAccessFile(String name, String mode)通过指定的文件名来创建随机访问文件对象
RandomAccessFile(File file, String mode)过指定的File对象来创建随机访问文件对象

       其中,参数mode表示对文件的访问模式,其取值如下:

  • “r”:表示以只读的方式打开文件,如果调用对象的写操作将会导致抛出IOException异常;
  • “rw”:表示以读写的方式打开文件,如果文件不存在,则尝试创建新的文件;
  • “rwd”:表示以读写的方式打开文件,相对于“rw”模式,还要求对文件内容的更新同步写入到基础存储设备中;
  • “rws”:表示以读写的方式打开文件,相对于“rw”模式,还要求对文件的内容或元数据的更新都同步写入到基础存储设备中。

       创建RandomAccessFile对象时,如果指定的文件不存在则会抛出FileNotFoundException异常,因此,在RandomAccessFile对象时需要增加相应的try-catch语句。

       例如,

RandomAccessFile rafile;

try {

    rafile=new RandomAccessFile("D:\\examples\\book.txt","rwd");

} catch (FileNotFoundException e) {

    e.printStackTrace();

}

2. 文件指针

       为了支持对文件的随机读写,RandomAccessFile类设置了文件指针,该指针以字节位单位,通过从文件头开始计算的偏移量来指明当前读写的位置。RandomAccessFile类提供了如下方法来操作文件的指针:

long getFilePointer()返回文件指针的当前位置
void seek(long pos)将文件指针定位到pos位置
int skipByte(int n)

跳过输入流中的n个字节不读,并返回实际跳过的字节数。

long length()返回文件的长度

       文件的位置从0开始,通过seek()方法可以将指针指向任何位置。

       例如,

rafile.writeInt(10); //向文件中写入一个整型值(长度为4)

rafile.writeDouble(20.15);//向文件写入一个双精度浮点值(长度为8)

System.out.println("len="+rafile.length());//len=12

rafile.seek(4);//将文件定位到位置4

System.out.println(rafile.readDouble());//20.5

3. 读写操作

       RandomAccessFile类除了提供了与InputStream和OutputStream类似的read()和write()方法外,还提供了直接读写各种基本类型数据的方法。

       RandomAccessFile类中用于读文件操作的主要方法如下:

方法功能描述
int read()从文件的当前位置开始读取一个字节的数据
int read(byte[] b)从文件的当前位置开始读取最多b.length个字节的数据存储在数组b中,并返回实际读取的字节数
int read(byte[] b, int off, int len)从文件的当前位置中读取最多len个字节的数据存放到字节数组b中从off开始的位置,并返回实际读取的字节数
boolean readBoolean()从文件当前位置开始读取一个布尔值
char readChar()从文件当前位置开始读取一个字符
byte readByte()从文件当前位置开始读取一个byte类型的值
short readShort()从文件当前位置开始读取一个短整型值
int readInt()从文件当前位置开始读取一个整型值
long readLong()从文件当前位置开始读取一个长整型值
float readFloat()从文件当前位置开始读取一个单精度浮点数
double readDouble()从文件当前位置开始读取一个双精度浮点数
String readUTF()从文件当前位置开始读取一个UTF格式的字符串
String readLine()从文本文件当前位置开始读取一行

       RandomAccessFile类中用于写文件操作的主要方法如下:

方法功能描述
void write(int b)向文件写入指定的字节数据
void write(byte[] b)将b.length个字节从指定的byte数组中写入到文件中
void write(byte[] b, int off, int len)将一个指定的byte数组中从off开始的len个字节写入文件中
void writeBoolean()在文件的当前位置写入一个布尔值
void writeByte(int v)在文件的当前的位置写入一个byte型值(只写入v的最低位字节)
void writeBytes(String s)按照字节序列的形式将一个字符串写入文件的当前位置
void writeChar(int v)在文件的当前位置写入一个字符(只写入v的最低2位字节)
void writeChars(String s)按照字符序列的形式将一个字符写入文件的当前位置
void writeShort(int v)在文件的当前位置写入一个短整型值(只写入v的最低2位字节)
void writeInt(int v)在文件的当前位置写入一个整型值
void writeLong(long v)在文件的当前位置写入一个长整型值
void writeFloat(float v)在文件的当前位置写入一个单精度浮点值
void writeDouble(double v)在文件的当前位置写入一个双精度浮点值
void writeUTF(String str)在文件的当前位置写入一个UTF格式的字符串,其长度是2个字节的长度信息加上字符串所占字节数(英文字符的长度为1个字节,中文汉字的长度为3个节)

4. 应用示例

       下面程序创建一个文本文件,然后利用RandomAccessFile类写入3个学生的信息,然后再将其读取出来写在控制台中。

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
	public static void main(String[] args) {
		try {
			RandomAccessFile accessFile=new 
                           RandomAccessFile("D:\\examples\\student.txt","rwd");
			long pos[]=new long[3];
			pos[0]=0;//第1个学生的初始位置
			accessFile.writeInt(1);
			accessFile.writeUTF("张三");
			accessFile.writeDouble(90);
			pos[1]=accessFile.getFilePointer();//第2个学生初始位置
			accessFile.writeInt(2);
			accessFile.writeUTF("李四");
			accessFile.writeDouble(80);
			pos[2]=accessFile.getFilePointer();//第3个学生初始位置
			accessFile.writeInt(3);
			accessFile.writeUTF("王五");
			accessFile.writeDouble(75);
			
			for(int i=0;i<3;i++) {
				accessFile.seek(pos[i]);//移到第i个学生初始位置
				int no=accessFile.readInt();
				String name=accessFile.readUTF();
				double score=accessFile.readDouble();
				System.out.println("编号:"+no+",姓名:"+name+",分数:"+score);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

程序运行结果如下:

编号:1,姓名:张三,分数:90.0

编号:2,姓名:李四,分数:80.0

编号:3,姓名:王五,分数:75.0

标签:文件,Java,int,读写,位置,写入,RandomAccessFile,随机,void
From: https://blog.csdn.net/hitmengfanchao/article/details/136963003

相关文章

  • java数据结构与算法基础-----排序------堆排序
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录堆排序是利用堆(数据结构)设计的排序算法,属于选择排序,最坏,最好,平均时间复杂度均为O(nlogn),不稳......
  • (Java)猛刷LeetCode——数组知识点篇
    数组Array在连续的内存空间中,存储一组相同类型的元素元素:值索引:数组的下标数组访问(Access)和数组搜索(Search)●数组访问:索引●数组搜索:找2这个元素数组中有没有以下是数组的常规操作:数组创建、添加元素、访问元素、修改元素、删除元素、遍历数组、查找元素、数组......
  • JavaScript之Promise补充与Dom操作
    Promise过程分析//按照顺序依次引入a-d.js,最后打印加载完毕load('a.js').then(()=>{returnload('b.js')//load方法返回Pomise对象//但是没有把这个对象返回//所以这个函数没有返回值//then方法会提供一个空对象作为返......
  • R语言--06文件读写read.table()、read.csv()
    1、读取-read.table()#文件读写部分#1.读取ex1.txtex1<-read.table("ex1.txt")ex3<-read.table("ex1.txt",header=T)看看有没有header的区别,以下是第一行代码的运行结果: 以下是第二行代码运行的结果:所以header=T的作用就是原本的文件已经给出了列名,不用重新再......
  • Java基础入门day19
    day19面向对象的三大特性三大特性封装继承多态封装packagecom.saas;​publicclassStudent{​  Stringname;  intage;  doublescore;  booleansex;}packagecom.saas;​publicclassTestEncapsulation{​  publicsta......
  • Java面向对象编程面试题
    序号问题详细答案1什么是类与对象?类和对象实例之间的关系?   类具有继承、数据隐藏和多态三种主要特性。类是同一类对象实例的共性的抽象,对象是类的实例化;类是静态的,对象是动态的,对象可以看作是运行中的类。类负责产生对象,可以将类当成生产对象的工厂2构造函数的特点有哪些(1......
  • [附源码]JAVA计算机毕业设计车辆维修管理系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着汽车行业的迅猛发展,车辆数量不断增加,车辆维修管理已成为一个亟待解决的问题。传统的车辆维修管理方式往往依赖于纸质记录和人工操作,效率低下且容......
  • [附源码]JAVA计算机毕业设计车辆理赔系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着汽车产业的快速发展,车辆保险业务逐渐成为保险公司的重要收入来源。然而,传统的车辆理赔流程繁琐,效率低下,难以满足现代快节奏生活的需求。因此,开发......
  • [附源码]JAVA计算机毕业设计安卓装维助手APP(开题+源码)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已经成为人们生活中不可或缺的一部分。在信息化社会的大背景下,各行各业的信息化水平也在不断提升。其中,计算机......
  • [附源码]JAVA计算机毕业设计安卓智能手机个性化定制问卷调查平台app(开题+源码)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网的迅猛发展,智能手机已成为人们日常生活中不可或缺的一部分。在个性化消费趋势的推动下,用户对智能手机的个性化定制需求日益增长。然而......