Java使用RandomAccessFile类对文件进行读写

2025-05-29 0 46

1. RandomAccessFile类简介

前面一篇随笔《File类遍历目录及文件》中有说到,File类只能用于表示文件或目录的名称、大小等信息,而不能用于文件内容的访问。而当需要访问文件内容时,就可以用RandomAccessFile类了。

RandomAccessFileJava提供用来访问一些保存数据记录的文件的类,可以进行读取操作,也可以进行写入操作,写入的数据则以byte的形式存储;支持随机访问,也就是可以访问文件的任意位置(通过文件指针实现)。

2. 构造函数

?

1

2
RandomAccessFile(String name, String mode)

RandomAccessFile(File file, String mode)

两个构造函数用法非常相似,name、file都是用于指定打开的文件路径和名称,mode则是指定打开文件的方式,常用的参数有两个"r"和"rw",也就是只读和读写。

文件打开后,文件指针指向文件最开始,也就是pointer=0,可通过RandomAccessFile了的getFilePointer()方法查看。

范例: 创建并打开一个数据文件。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
//创建目录

File dir = new File("demo");

if (!dir.exists()) {

dir.mkdir();

}

//创建文件

File file = new File(dir, "test.dat");

if (!file.exists()) {

file.createNewFile();

}

//实例化RandomAccessFile对象

RandomAccessFile raf = new RandomAccessFile(file, "rw");

//打开文件时指针位置在最前,即0

System.out.println(raf.getFilePointer());

3. 写入操作

?

1

2

3
write(int i)

write(byte[] b)

write(byte[] b, int off, int len)

第三个方法中的off为数组b中需要写入的数据的起始索引值,len则是要写入的长度。write方法每次写入一个字节,如果写入的数据超过一个字节,则写入后八位(如果这里不太理解,可看看:二进制运算基础)。

另外,每写入一个字节,文件指针指向下一个字节。

范例: 通过write()方法向文件中写入一个整型数。(沿用上面例子创建的对象)

?

1

2

3

4

5

6
//write()方法每次只插入一个字节,大于一个字节的则写入后八位,因此写入一个整型数需要写入四次

int num = 28;

raf.write(num >>> 24);

raf.write(num >>> 16);

raf.write(num >>> 8);

raf.write(num);

当然,RandomAccessFile类也提供了更简便的方法writeXxx(),如果插入一个整型,可直接writeInt(i);,boolean的则为writeBoolean(),以此类推。但是要清楚的是,这些方法的还是通过上面的write()方法实现的。

范例: 以下为RandomAccessFile类中writeInt()方法的方法体。

?

1

2

3

4

5

6

7
public final void writeInt(int v) throws IOException {

write((v >>> 24) & xFF);

write((v >>> 16) & xFF);

write((v >>> 8) & xFF);

write((v >>> 0) & xFF);

//written += 4;

}

4. 读取操作

?

1

2

3
read(int i)

read(byte[] b)

read(byte[] b, int off, int len)

与写入操作类似,读取操作是通过read()方法实现的,每次读取一个字节,同时文件指针指向下一个位置(通过seek()方法将指针移到读取位置)。同时,RandomAccessFile类也封装了readXxx()系列方法用于简便读取,原理和使用方法可参考写入操作,基本类似。

范例: 将数据文件中的所有数据以整型形式读取出来。

?

1

2

3

4

5
//读取文件,在读取前需要通过seek()方法把文件指针移到最前

raf.seek(0);

for (int i = 0; i*4 < raf.length(); i++) {

System.out.println(raf.readInt());

}

5. 关闭文件

打开的文件一定要通过close()关闭,否则可能会出现不可预料的错误。

6. 完整例子

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39
import java.io.File;

import java.io.IOException;

import java.io.RandomAccessFile;

public class MyRandomAccessFile {

public static void main(String[] args) throws IOException {

//创建目录

File dir = new File("demo");

if (!dir.exists()) {

dir.mkdir();

}

//创建文件

File file = new File(dir, "test.dat");

if (!file.exists()) {

file.createNewFile();

}

//实例化RandomAccessFile对象

RandomAccessFile raf = new RandomAccessFile(file, "rw");

//打开文件时指针位置在最前,即0

System.out.println(raf.getFilePointer());

//写入数据

int[] num = {28, 14, 56, 23, 98};

for (int i : num) {

raf.writeInt(i);

}

//读取文件,在读取前需要通过seek()方法把文件指针移到最前

raf.seek(0);

for (int i = 0; i*4 < raf.length(); i++) {

System.out.println(raf.readInt());

}

//操作结束后一定要关闭文件

raf.close();

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.cnblogs.com/joahyau/p/6722708.html?utm_source=tuicool&utm_medium=referral

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java使用RandomAccessFile类对文件进行读写 https://www.kuaiidc.com/117619.html

相关文章

发表评论
暂无评论