RandomAccessFile的基本用法

介绍:

RandomAccessFile的唯一父类是Object,与其他流父类不同。是用来访问那些保存数据记录的文件的,这样你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。

工作方式:

RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream粘起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件,从这一点上看,假如RandomAccessFile继承了DataInputStream,它也许会干得更好。

一些方法介绍:

构造方法:RandomAccessFile(File file,String mode)  RandomAccessFile(String name,String mode)

model参数指定用以打开文件的访问模式  1."r"以只读方式打开  2."rw"可以读取也可以写入  3."rws"   4."rwd"

从文件中读取数据:read() readBoolean() readByte()....

向文件中写入数据:write() writeBoolean() writeByte()....

**设置游标位置:seek(long pos) pos表示游标位置,

RandomAccessFile是根据游标来进行读写操作的,若原来位置有数据,仍往文件中写入数据,会覆盖原有的数据。

使用RandomAccessFile处理有规律的数据是比较好的:数据库表。

需要读取哪个位置的数据,可以根据规律算出其位置,在把游标设置到此位置开始读取。

代码演示:

@Test
	public void advDemo(){
		try {
			RandomAccessFile raf = new RandomAccessFile("b.txt", "rw");
			for(int i=0;i<4;i++){
				raf.writeDouble(3.14*i);// 0  3.14  6.28  9.42
			}
			/*发生EOFException,因为此时游标在文件末尾处,所以无法读取
			for(int i=0;i<4;i++){
				double d = raf.readDouble();
				System.out.println(i+":"+d);
			}
			*/
			
			raf.seek(0);//把游标定位到文件起始处
			for(int i=0;i<4;i++){
				double d = raf.readDouble();
				System.out.println(i+":"+d); // 0  3.14  6.28  9.42
			}
			
			System.out.println("-----------------");
			raf.seek(16);
			raf.writeDouble(0); //写完,游标走到24的位置,如果此时不控制游标往后读,只能读到一个数据
			
			raf.seek(0);//定位到起始处
			for(int i=0;i<4;i++){
				double d = raf.readDouble();
				System.out.println(i+":"+d); // 0  3.14  0  9.42
			}
			
			System.out.println("================");
			raf.seek(18);
			raf.writeDouble(0); //把第18~25处的二进制位全部修改成0
			raf.seek(0);//定位到起始处
			for(int i=0;i<4;i++){
				double d = raf.readDouble();
				System.out.println(i+":"+d);//因为第16-23处的二进制都为0 所以第三个数还是0不变,而第四个数乱码 // 0  3.14  0  1.16816377571628E-309
			}
			
			raf.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
结果:

0:0.0
1:3.14
2:6.28
3:9.42
-----------------
0:0.0
1:3.14
2:0.0
3:9.42
================
0:0.0
1:3.14
2:0.0
3:1.16816377571628E-309





你可能感兴趣的:(流)