Java_io体系之RandomAccessFile简介、走进源码及示例――20(一)

2014-11-24 07:53:39 · 作者: · 浏览: 1

Java_io体系之RandomAccessFile简介、走进源码及示例――20

RandomAccessFile


1、 类功能简介:

文件随机访问流、关心几个特点:

1、他实现的接口不再是InputStream、OutputStream中的任何一个、而是实现的DataInput、DataOutput。这也注定了他可以对java基础类型进行操作、而且是即可读取、也可以写入、关于这部分的方法大多数都是从DataInputStream、DataOutputStream那里荡来的。

2、如其名、随机流、这里的随机并不是不可控制、不可预测的去访问文件、而是可以通过指针的形式定位到具体的位置――“文件指针”、具体使用“文件指针”的方法:调用此流的seek(long n)方法来设置位置、使用此方法要注意的是如果传入的n大于文件长度、此方法不会改变文件长度、只是当写入下一个字节时会改变文件大小、即下一个写入的字节是添加在n后的。如果n小于文件长度、则会从n位置开始覆盖后面的file内容、

3、此流既可以读取文件、也可以写入文件、也可具有只读功能、但是没有只写功能、具体是哪种类型是在构造方法中指定的――String mode;具体的区别上面有说明。。

这里把实例放在了前面、因为源码和方法所占篇幅太长、有兴趣的可继续往下看。

2、 实例演示:

package com.chy.io.original.test;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTests {
	
	private static final File file = new File("D:\\rsf.txt");
	
	/**
	 * 向文件中写入内容
	 */
	public static void testRandomAccessFileWriter() throws IOException{
		//要先将已有文件删除、避免干扰。
		if(file.exists()){
			file.delete();
		}
		
		RandomAccessFile rsfWriter = new RandomAccessFile(file, "rw");
		
		//不会改变文件大小、但是他会将下一个字符的写入位置标识为10000、也就是说此后只要写入内容、就是从10001开始存、
		rsfWriter.seek(10000);
		printFileLength(rsfWriter);		//result: 0
		
		//会改变文件大小、只是把文件的size改变、并没有改变下一个要写入的内容的位置、这里注释掉是为了验证上面的seek方法的说明内容
		//rsfWriter.setLength(10000);
		printFileLength(rsfWriter);		//result: 0
		
		//每个汉子占3个字节、写入字符串的时候会有一个记录写入字符串长度的两个字节
		rsfWriter.writeUTF("陈华应");	
		printFileLength(rsfWriter);		//result: 10011
		
		//每个字符占两个字节
		rsfWriter.writeChar('a');
		rsfWriter.writeChars("abcde");
		printFileLength(rsfWriter);		//result: 10023
		
		//再从“文件指针”为5000的地方插一个长度为100、内容全是'a'的字符数组
		//这里file长依然是10023、因为他是从“文件指针”为5000的地方覆盖后面的200个字节、下标并没有超过文件长度
		rsfWriter.seek(5000);
		char[] cbuf = new char[100];
		for(int i=0; i
  
   

3、 RandomAccessFile API简介:


A:构造方法


	RandomAccessFile(File file, String mode)     创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。 
	
	RandomAccessFile(String name, String mode)  	从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。 

补充一:mode的取值有下面四种情况

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。

"rw" 打开以便读取和写入。

"rws" 打开以便读取和写入。相对于 "rw","rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。

"rwd" 打开以便读取和写入,相对于 "rw","rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备。

补充二:关于文件的“元数据”

The definition of metadata is "data about other data." With a file system, the data is contained in its files and directories, and the metadata tracks information about each of these objects: Is it a regular file, a directory, or a link What is its size, creation date, last modified date, file owner, group owner, and access permissions

补充三:"rw" "rws" "rwd"之间的区别

当操作的文件是存储在本地的基础存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。

当模式是 "rws" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,都会将这些改变同步到基础存储设备上。

当模式是 "rwd" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]”时,都会将这些改变同步到基础存储设备上。

当模式是 "rw" 并且 操作的是基础存储设备上的文件;那么,关闭文件时,会将“文件内容的修改”同步到基础存储设备上。至于,“更改文件内容”时,是否会立即同步,取决于 系统底层实现。

一般使用前两个就ok。

B:一般方法


	 void close()    关闭此随机访问文件流并释放与该流关联的所有系统资源。 
	 
	FileChannel getChannel()    返回与此文件关联的唯一 FileChannel 对象。 
	
	FileDescriptor getFD()    返回与此流关联的不透明文件描述符对象。 
	
	long getFilePointer()      返回此文件中的当前偏移量。 
	
	long length()     返回此文件的长度。