RandomAccessFile:对文件随机访问

本文介绍了Java中的RandomAccessFile类,用于对文件进行随机读写操作。通过构造函数创建对象,设置不同的访问模式如只读或读写。详细讲解了write和read方法,以及文件指针的操作,包括定位、跳过字节等,帮助理解如何高效地访问文件内容。

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

1、前言

   文件是什么:

  文件中存储的是数据

  任何文件都是有byte数据组成的有序的数列

  byte数据:是文件的最小(原子、不可在分)单位

2、创建对象

1)new RandomAccessFile(File file,String mode)

2)new RandomAccessFile(String filename,String mode)

解析RandomAccessFile构造方法参数:第一个参数是需要访问的文件,而第二个参数则是访问模式

访问模式(mode) |--”r”    只读模式  若文件不存在,会抛FileNotFoundException  (系统找不到指定文件)

                 |--”rw”  读写模式  若文件不存在,会自动创建

若设置为读写模式该文件的访问就是即可读又可写。

3、字节数据读写操作

2.1 、void write(int d)方法:该方法会根据当前指针所在位置写入一个字节。是将参数int的“低8位”写出。

2.2、int read()方法:该方法会从文件中读取一个byte(8位)填充到int的低8位,高24位为0。返回值范围正         数:0~255。如果返回-1表示读取到了文件末尾!每次读取后自动移动文件指针,准备下次读取。

2.3、void write(byte[] d)方法:该方法会根据当前指针所在位置处连续写出给定数组中的所有字节。

2.4、void write(byte[] d,int offset,int len)方法:该方法会根据当前指针所在位置处连续写出给定数组中       的部分字节,这部分是从数组的offset的开始连续len个字节。

2.5、int read(byte[] b)方法:该方法会从指针位置处尝试最多读取给定数组的总长度,并从给定的字节数组第        一个位置开始,将读取到的字节顺序放置数组中,返回值为实际读取到的字节量。

2.6、close():RandomAccessFile在对文件访问的操作全部结束要调用close()方法来释放与其他关联的所有系      统资源。

	/** 1)使用RandomAccessFile的write方法向文件raf.dat写入数字“1” */
	/**2)使用RandomAccessFile的read方法从文件raf.dat中将数字“1”读取出来并打印到控制台
	 * @throws IOException */
	@Test
	public void testWrite() throws IOException{
		RandomAccessFile raf =
				new RandomAccessFile("raf.dat","rw");
		//写出一个字节,写的是一个int值的低8位
		raf.write(1);//(0000 0000 0000 0000 0000 0000) 0000 0001 省略前面24位 
		raf.write(-1);//(1111 1111 1111 1111 1111 1111)1111 1111 省略前面24位
		raf.close();
	}
	@Test
	public void testRead() throws IOException{
		RandomAccessFile raf =
				new RandomAccessFile("raf.dat","r");
		//读取一个字节
		int d;
		while((d = raf.read())!=-1){
			//1)d读取1: 0000 0000 0000 0000 0000 0000 0000 0001 读取raf中的一个字节
			//赋值给int的型 前面就高24位就0填充。最终结果(10进制):1
			//3)d读取-1: 0000 0000 0000 0000 0000 0000 1111 1111 。最终结果(10进制):255
			System.out.println(d);
			//2)d读取1: 0000 0000 0000 0000 0000 0000 0000 0001
			//若以(2进制)形式打印出来 前面的0省略。最终结果:1
			//4)d读取-1: 0000 0000 0000 0000 0000 0000 1111 1111 。最终结果:1111 1111
			System.out.println(Integer.toBinaryString(d));
		}
		raf.close();
	}

        /**1)使用RandomAccessFile的write(byte[])方法向文件raf.dat写入字符串“HelloWorld”*/
	/**2)使用RandomAccessFile的read(byte[])方法从文件raf.dat中将字符串“HelloWorld”取
	 * 出来并打印到控制台
	 * @throws IOException */
	@Test
	public void testWriteByteArray() throws IOException{
		RandomAccessFile raf = 
				new RandomAccessFile("raf.dat","rw");
		byte[] buf ="HelloWorld".getBytes();
		raf.write(buf);
		raf.close();
	}
	@Test
	public void testReadByteArray() throws IOException{
		RandomAccessFile raf =
				new RandomAccessFile("raf.dat","r");
		byte[] buf = new byte[10];
		//len 最终值为读取的字节量
		int len = raf.read(buf);
		System.out.println("读取到了 :"+len+"字节");//读取到了:10字节
		System.out.println(new String(buf));//HelloWorld
		raf.close();
	}

4、文件指针操作

3.1、long getFilePointe()方法:该方法获得当前RandomAccessFile指针位置,打开文件是默认指针位置在0。

3.2、void seek(long pos)方法:该方法移动当前RandomAccessFile的指针位置。

3.3、int skipBytes(int n)方法:该方法跳过输入的n个字节以丢弃跳过的字节。此3方法不出EOFException

   (文件结束异常)。返回结果是跳过实际字节数。如果n为负数,则不跳过任何字节。

        @Test
	public void testGetFilePointer() {
		try {
			//创建RandomAccessFile 进行读写操作
			RandomAccessFile raf = new RandomAccessFile("abc.txt","rw");
			System.out.println(raf.getFilePointer());//0
			raf.write('A');//'A' 占1个byte
			System.out.println(raf.getFilePointer());//1
			raf.writeInt(3);//3 占4个byte
			System.out.println(raf.getFilePointer());//5
			//将指针移动到文件开始处(第一个字节的位置)
			raf.seek(0);
			System.out.println(raf.getFilePointer());//0
			//指针跳两个字节
			raf.skipBytes(2);
			System.out.println(raf.getFilePointer());//2
			//访问完文件,释放资源
			raf.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值