IO---随机访问文件流

随机访问文件流


public class RandomAccessFile implements DataOutput, DataInput, Closeable
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 

DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。同时还提供了一个将 String 转换成 UTF-8 修改版格式并写入所得到的系列字节的工具。

DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。同时还提供根据 UTF-8 修改版格式的数据重构 String 的工具。
  • 构造方法
public RandomAccessFile(String name, String mode)       //创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
public RandomAccessFile(File file, String mode)         //创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。

mode

含意
r 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
rw 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
rws 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
rwd 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

  • 基本数据类型(六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型)

byte :Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short :短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0
int :整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long :长整型,在内存中占64位,即8个字节-263~263-1,默认值0L
float :浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double :双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char :字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

eg:

public class RATest {
	public static void main(String[] args) throws IOException {
		write();
		read();
	}
	
	private static void write() throws IOException{
		RandomAccessFile raf = new RandomAccessFile(new File("d:/blog/test.txt"),"rw");
		raf.writeInt(7);
		raf.writeUTF("china no 1");
		raf.writeInt(11);
		raf.writeUTF("taiwan no 2");
		raf.writeInt(21);
		raf.writeUTF("japan no 3");
		raf.close();
	}
	
	private static void read() throws IOException{
		RandomAccessFile raf = new RandomAccessFile(new File("d:/blog/test.txt"),"r");
		int i = raf.readInt();
		System.out.println(i);						//7
		System.out.println(raf.getFilePointer());	//4
		System.out.println(raf.readUTF());			//china no 1
		System.out.println(raf.getFilePointer());	//16
		raf.seek(0);
		System.out.println(raf.readInt());			//7
		System.out.println(raf.readUTF());			//china no 1
		System.out.println(raf.getFilePointer());	//16
		raf.skipBytes(4);
		raf.skipBytes(13);							//writeUTF 默认会在前面增加2个字节的长度所以实际是13个字节的长度
		//System.out.println(raf.readUTF());		//taiwan no 2 
		System.out.println(raf.getFilePointer());	//33
		System.out.println(raf.readInt());			//21
		System.out.println(raf.readUTF());			//japan no 3
		System.out.println(raf.getFilePointer());	//49
		raf.close();
	}
}
posted @ 2018-05-05 16:06  Ch1nYK  阅读(176)  评论(0编辑  收藏  举报