博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java-io之RandomAccessFile
阅读量:6439 次
发布时间:2019-06-23

本文共 3966 字,大约阅读时间需要 13 分钟。

hot3.png

RandomAccessFile

java提供了一个可以对文件随机访问的操作,访问包括读和写操作。

 该类名为RandomAccessFile。该类的读写是基于指针的操作。

RandomAccessFile在对文件进行随机访问操作时有两个模式,

 分别为只读模式(r),和读写模式(rw)

 在创建RandomAccessFile时,需要给传入加两个参数:

  1、 操作的文件(文件路径String,File 对象) 如果文件不存在,自动创建

  2、 读写模式

public static void main(String[] args) {		try {			RandomAccessFile raf=new RandomAccessFile("data.bat", "rw");			//返回此文件中的当前偏移量。			long point=raf.getFilePointer();			System.out.println(point);			// 4+16*6=96+4			raf.seek(100);			//01111111(1+2+4+8+16+32+64)			//把int的低八位写入到文件中			raf.write(1);			System.out.println("现在的指针位置:"+raf.getFilePointer());			raf.write("i love you".getBytes());			/**			 * 读写完毕后要关闭流,释放资源			 */			raf.close();		} catch (Exception e) {			e.printStackTrace();		}	}

/** * 如果读到文件末尾,那么会报EOFException,(End of File),文件末尾返回-1 * @author king-pan * */public class RandomAccessFileDemo02 {	/**	 * @param args	 */	public static void main(String[] args) {		try {			RandomAccessFile raf=new RandomAccessFile("data.bat", "rw");			raf.seek(100);			int i=raf.read();			System.out.println(i);			raf.close();		} catch (Exception e) {			e.printStackTrace();		}	}}

 

文件的copy--原理:

/** * 使用RandomAccessFile实现文件复制 * 步骤: * 1. 创建一个RandomAccessFile用于读取原文件 * 2. 创建一个RandomAccessFile用于写到目标文件 * 3. 循环一下操作: * 	3.1:从原文件兑取一个字节 *  3.2:将该字节写入到目标文件中 *  退出条件: 当读取的值为-1时,到达文件末尾,结束 *   * 4. 关闭流,释放资源 * @author king-pan * */public class CopyDemo {	public static void main(String[] args) throws Exception{		RandomAccessFile srcFile=new RandomAccessFile("Linux.txt", "r");		RandomAccessFile descFile=new RandomAccessFile("LinuxCopy.txt", "rw");		int val=-1;		while((val=srcFile.read())!=-1){			descFile.write(val);		}		srcFile.close();		descFile.close();	}}

文件copy的优化:

/** * 使用RandomAccessFile实现文件复制(高效率) * 步骤: * 1. 创建一个RandomAccessFile用于读取原文件 * 2. 创建一个RandomAccessFile用于写到目标文件 * 3. 循环一下操作:(在读写操作过程中优化) * 	3.1:从原文件兑取一个字节 *  3.2:将该字节写入到目标文件中 *  退出条件: 当读取的值为-1时,到达文件末尾,结束 *   * 4. 关闭流,释放资源 * @author king-pan * */public class CopyDemo02 {	public static void main(String[] args) throws Exception{		RandomAccessFile srcFile=new RandomAccessFile("Linux.txt", "r");		RandomAccessFile descFile=new RandomAccessFile("LinuxCopy.txt", "rw");		byte [] buf=new byte[1024*10];//数组10kb的容量		/*		 * int read(byte[] b)		 * 一次性读取byte[]长度个字节,并将这些字节存入该数组。		 * 返回值为实际读取道德字节量		 * 若返回值为-1,说明这一次没有读到任何字节,也就是文件读到末尾了		 */		int length=-1;		//测试效率 开始时间		long start=System.currentTimeMillis();		while((length=srcFile.read(buf))!=-1){			/*			 * 将给定数组中的所有内容写入到文件中			 * 最后一次写入可能length小于数组的长度			 */			descFile.write(buf,0,length);		}		//复制完后的时间		long end=System.currentTimeMillis();		System.out.println("耗时:"+(end-start));		srcFile.close();		descFile.close();	}}

RandomAccessFile对基本类型的读写操作:

public static void write(){		try {			RandomAccessFile raf=new RandomAccessFile("test.bat","rw");			int max=Integer.MAX_VALUE;			/**			 * 右移运算				 * raf.write(max>>>24);			 * raf.write(max>>>16);			 * raf.write(max>>>8);			 * raf.write(max); 			 */			raf.writeByte(Byte.MAX_VALUE);			raf.writeBoolean(Boolean.TRUE);			raf.writeChar(Character.MAX_CODE_POINT);			raf.writeShort(Short.MAX_VALUE);			//完整的写入了一个int			raf.writeInt(max);			raf.writeLong(Long.MAX_VALUE);			raf.writeFloat(Float.MAX_VALUE);			raf.writeDouble(Double.MAX_VALUE);			raf.close();		} catch (Exception e) {			e.printStackTrace();		}	}	public static void read(){		try {			RandomAccessFile raf=new RandomAccessFile("test.bat","rw");			byte b=raf.readByte();			boolean bl=raf.readBoolean();			char c=raf.readChar();			short s=raf.readShort();						int i=raf.readInt();			long l=raf.readLong();			float f=raf.readFloat();			double d=raf.readDouble();						System.out.println("byte:"+b);			System.out.println("boolean:"+bl);			System.out.println("char:"+c);			System.out.println("short:"+s);			System.out.println("int:"+i);			System.out.println("long:"+l);			System.out.println("float:"+f);			System.out.println("double:"+d);			raf.close();		} catch (Exception e) {			e.printStackTrace();		}	}

转载于:https://my.oschina.net/KingPan/blog/322917

你可能感兴趣的文章
asp.net core mvc 中间件之WebpackDevMiddleware
查看>>
Word2Vec之Skip-Gram与CBOW模型原理
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.3. 角色成员关系...
查看>>
Android冷启动白屏问题
查看>>
Android开发之Activity转场动画
查看>>
“阿里通信云对讲 从此沟通无难事”渠道分销合作伙伴大会盛大召开
查看>>
OpenSearch在线干预服务
查看>>
Java 8 中的 Streams API 详解
查看>>
Redis 复制(学习笔记六)
查看>>
堆电池、增续航是缓解电动车“里程焦虑”的灵丹妙药吗?
查看>>
嘿!基于双11的脉冲计算核心能力现已上线!
查看>>
javascript:数组总结(一)
查看>>
[Github] github常见问题汇总
查看>>
设计模式(三) 单例模式
查看>>
开发笔记2 | Java 代码规约第1条
查看>>
css基础小知识笔记
查看>>
MySQL 数据库规范--开发篇
查看>>
算法系列15天速成——第十四天 图【上】
查看>>
Confluence 6 链接到其他应用
查看>>
重新学习Mysql数据库8:MySQL的事务隔离级别实战
查看>>