RandomAccessFile类

RandomAccessFile 是输入/输出流体系中,功能最丰富的文件内容访问类,即能读对一个文件进行读操作,也可以进行写操作

案例1

/**
 * 
 * 使用RandomAccessFile 向指定文件的指定位置加指定内容:
 * 需求: 向项目下的hello.txt的第二个位置后,加入 “大帅比” 内容
 * 
 * hello.txt 内容如下:
 * 		abcd
 * 
 * @author 王XX
 *
 */
public class Demo9 {
	
	public static void main(String[] args) throws IOException {
		
		RandomAccessFile raf = null;
		try {
			raf = new RandomAccessFile("hello.txt", "rw");
			
			//让文件记录指针,移到2
			raf.seek(2);
			
			raf.write("大帅比".getBytes());
			
			/**
			 * 结果内容如下:
			 * 	ab大帅比
			 * 
			 * 直接插入会覆盖数据,而且覆盖的多少是取决于你,写的字节数,这里是3个汉字
			 * 而且是UTF-8编码,所以是9个字节,也就是说会覆盖b后面的9个字节数据
			 */
			
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(raf != null) raf.close();
		}
	}
}

 

案例2: 

/**
 * RandomAccessFile: 任意访问文件,是一个既可以读,又可以写的IO流
 * 
 * 原始数据: abcd
 * 期望数据: ab大帅比cd
 * 
 * 通过案例已知,直接写的话,会覆盖原有的数据,因此换一个思路:
 * 1.先将文件指针移到指定的位置
 * 2.将指针后面的数据,先存入到一个临时文件中
 * 3.这时文件记录指针,移到了后面,因此又得指定到原来的位置
 * 4.然后写入内容
 * 5.最后把临时文件里面的内容,追加到后面即可
 * 
 * @author XXX
 *
 */
public class Demo10 {

	public static void main(String[] args) throws IOException {
		RandomAccessFile raf = null;
		FileOutputStream fos = null;
		FileInputStream  fis = null;
		File tempFile = File.createTempFile("tmp", ".txt");
		System.out.println(tempFile.exists());//虽然我这里看不到,但它确实创建了
		tempFile.deleteOnExit();//临时一般程序完后,会让它销毁
		try {
			 raf = new RandomAccessFile("hello.txt", "rw");
			 fos = new FileOutputStream(tempFile);
			 fis = new FileInputStream(tempFile);
			 System.out.println("文件记录指针: "+raf.getFilePointer());//0
			 raf.seek(2);
			 
			 byte[] bytes = new byte[1024];
			 //返回实际读取的字节数
			 int len;
			 //最多从输入流中读取bytes.length个字节,并存储到数组中,返回实际读取的字节数
			 while((len = raf.read(bytes)) != -1) {
				 System.out.println("实际读取的字节数: "+len);//2
				 fos.write(bytes, 0, len);
			 }
			 
			 /**
			  * 记得把指针移到原来的位置不然文件指针移到了末尾去了!!
			  * 那么你就不是从你之前seek()的位置后面写了,而是读完之后的后面写
			  */
			 System.out.println("文件记录指针:"+raf.getFilePointer());//4
			 raf.seek(2);
			 
			 //然后在写入
			 raf.write("大帅比".getBytes());
			 
			 //然后从临时文件中读取,写入
			 while((len = fis.read(bytes)) != -1) {
				 raf.write(bytes, 0, len);
			 }
			 
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(fis != null) fis.close();
			if(fos != null) fis.close();
			if(raf != null) fis.close();
		}
	}
}

为什么要学习这个嘞,为以后写一个多线程下载工具打下一个基础,可能现在你还体会不到它的用处

图解案例2

 

最后有什么写的不好的,希望各位可以不吝指出

觉得对你有帮助的,想打赏的可以打赏一下,哈哈哈,多少无所谓,这也是对我一种支持与鼓励吗,最后不喜勿喷

有志同道合的小伙伴可以加QQ群讨论:897992110

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值