File操作 - RandomAccessFile使用详解

本文深入介绍了Java中的RandomAccessFile类,探讨了其基本概念、工作原理及如何进行文件的读写与复制。同时,还详细解释了如何通过定位和跳过字节来实现随机访问。

【1】RandomAccessFile基本概念

RandomAccessFile主要完成随机读取的功能,可以读取指定位置的内容。不属于InputStream和OutputStream类系的。

实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能。

它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。

在这里插入图片描述


RandomAccessFile的工作方式

把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法。

比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。

此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。

需要注意的是,它不支持只写文件。

只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。

BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。

public class RandomAccessFile implements DataOutput, DataInput, Closeable {
	//...
}

RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。

  • 支持只访问文件的部分内容;
  • 可以向已存在的文件后追加内容;

记录指针

RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:

long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置

构造器

public RandomAccessFile(File file, String mode) 
public RandomAccessFile(String name, String mode)

创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 。

RandomAccessFile 的访问模式(mode):

r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新

【2】文件的读写与复制

实例代码如下:

	@Test
	public void testRandomAccessFile(){
		RandomAccessFile rFile1 = null;
		RandomAccessFile rFile2 = null;
		try {
			/*相对于项目路径--contextPath路径*/
			File file1 = new File("test1.txt");
			File file2 = new File("test3.txt");
			
			/* rw 读写模式*/
			rFile1 = new RandomAccessFile(file1, "rw");
			rFile2 = new RandomAccessFile(file2, "rw");
			
			int len = 0;
			byte[] b = new byte[1024];
			/*--读入到byte数组并进行输出--*/
			while ((len = rFile1.read(b)) !=-1) {
				System.out.println("ASCII :"+len+"value :"+new String(b,0,len));//new String() turn to be String
				/*写入到另一个文件*/
				rFile2.write(b, 0, len);
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
	}

【3】输出文件的大小

test1.txt文件内容:123456我们要有梦想

System.out.println(rFile1.length());

24bytes—24个字节
这里写图片描述


【4】跳到指定位置读取文件

seek(long a)是定位文件指针在文件中的位置。

参数a确定读写位置距离文件开头的字节个数,比如seek(0)就是定位文件指针在开始位置,其是绝对定位。

rFile1.seek(1);//从第二个字节开始

实例代码如下:

	RandomAccessFile raf = new RandomAccessFile(“test.txt”, “rw”);
    raf.seek(5);
	byte [] b = new byte[1024];

	int off = 0;
	int len = 5;
	raf.read(b, off, len);
		
	String str = new String(b, 0, len);
	System.out.println(str);
		
	raf.close();


【5】跳过指定字节

skipBytes()是指在文件中跳过给定数量的字节,其是相对定位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值