Java RandomAccessFile类

本文深入探讨了Java中RandomAccessFile类的特性和用途,包括其读写操作、访问模式及如何实现文件的随机访问。同时,对比了与内存映射文件的差异,通过实例演示了如何使用该类进行文件的读取、追加和插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件
2、RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类
3、RandomAccessFile 是 Java 输入/输出流体系中功能丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。RandomAccessFile 支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读写数据
RandomAccessFile四种访问模式:
(1)“r”:以只读方式打开指定文件。如果试图对该 RandomAccessFile 执行写入方法,都将抛出 IOException 异常。
(2)“rw”:以读、写方式打开指定文件。如果该文件尚不存在,则尝试创建该文件
(3)"rws”:以读、写方式打开指定文件。相对于"rw"模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 (4)“rwd”:以读、写方式打开指定文件。相对于"rw"模式,还要求对文件的内容的每个更新都同步写入到底层存储设备
RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)"给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了

public class RandomAccessFileDemo {
	public static void main(String[] args) throws IOException {
		// demo1();
		// demo2();
		// demo3();
		demo4();
	}

	public static void demo1() throws IOException {
		RandomAccessFile accessFile = new RandomAccessFile(
				"E:\\Java课件\\HelloWorld.java", "r");
		accessFile.seek(24);

		// 读取文件
		byte[] bytes = new byte[1024];
		int count = 0;
		while (-1 != (count = accessFile.read(bytes, 0, bytes.length))) {
			System.out.print(new String(bytes, 0, count));
		}
		accessFile.close();
	}

	public static void demo2() throws IOException {
		RandomAccessFile accessFile = new RandomAccessFile(
				"E:\\Java课件\\HelloWorld.java", "rw");
		// 跳到文件末尾位置
		accessFile.seek(accessFile.length());
		accessFile.write("//追加在最后".getBytes("utf-8"));
		// 关闭流
		accessFile.close();
	}

	/**
	 *       * RandomAccessFile依然不能向文件的指定位置插入内容,      
	 * * 如果直接将文件记录指针移动到中间某位置后开始输出,       * 则新输出的内容会覆盖文件中原有的内容。       *
	 *      * 如果需要向指定位置插入内容,       * 程序需要先把插入点后面的内容读入缓冲区,      
	 * * 等把需要插入的数据写入文件后,       * 再将缓冲区的内容追加到文件后面。      
	 * */
	public static void demo3() throws IOException {
		RandomAccessFile accessFile = new RandomAccessFile(
				"E:\\Java课件\\HelloWorld.java", "rw");
		accessFile.seek(100);
		accessFile.write("//会覆盖掉后面的信息".getBytes("utf-8"));
		accessFile.close();
	}

	/**
	 * 在指定位置插入字符串
	 * 
	 * @throws IOException
	 */
	public static void demo4() throws IOException {
		// 存放读取到的 插入点后面的内容
		ByteArrayOutputStream arrayout = new ByteArrayOutputStream();

		RandomAccessFile accessFile = new RandomAccessFile(
				"E:\\Java课件\\HelloWorld.java", "rw");
		// 调到指定位置
		accessFile.seek(100);

		// 读取指定位置后的内容到 arrayout
		byte[] bytes = new byte[1024];
		int count = 0;
		while (-1 != (count = accessFile.read(bytes, 0, bytes.length))) {
			arrayout.write(bytes, 0, count);
		}
		// 调到指定位置
		accessFile.seek(100);
		// 插入想插入的内容
		accessFile.write("//插入的字符串".getBytes(Charset.forName("utf-8")));

		// 读取arrayout 里面的内容,追加会源文件
		accessFile.write(arrayout.toByteArray());

		// 关闭流
		accessFile.close();
	}
}

示例代码执行结果:
Demo1方法:

在这里插入图片描述
Demo2方法:
在这里插入图片描述
Demo3方法:
在这里插入图片描述
Demo4方法:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值