该类不算是IO体系中的子类,而是直接继承自Object类的,但是它是IO包中的成员,因为它具备读写功能。内部封装了一个数组,而且可以通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针,还可以通过seek方法改变指针的位置。其实完成读写的原理是:其内部封装了字符输出流和输出流。
通过构造函数可以看出该类可以操作文件;而且操作文件还有格式“r”,”rw”,”rws”,”rwd”
RandomAccessFile(File file, String mode)
RandomAccessFile
(String name,
String mode)
并且RandomAccessFile中提供了读写基本数据类型的方法法
"rw"操作模式下RandomAccessFile在创建对象时,如果传入的文件不存在,则会创建文件,若存在,则不会创建,既不会覆盖原文件。,但是写入是是从0指针位置开始的,写入的时候会覆盖,如不想覆盖原内容,则可以同过Seek或者skipBytes方法逃过指定的内容在写入
操作文件的模式只能是: "r"、"rw"、"rws"或 "rwd" ;模式为“r”时只能读,不能写,写会报异常,并且“r”操作模式下的RandomAccessFile在创建对象时,不会创建文件只会去读取一个已存在的文件,如果传入的文件不存在,会报异常FileNotFounException
import java.io.IOException;
import java.io.RandomAccessFile;
public classRandomAccessFileDemo {
/**
* @param args
*/
public static void main(String[] args)throws IOException{
// TODO Auto-generated method stub
//writeFile();
//readFile();
writeFile_2();
}
//读取文件中的数据,随机读取文件中的数据
public static void readFile() throws IOException {
//操作文件的模式只能是: "r"、"rw"、"rws"或 "rwd";模式为“r”时只能读,不能写,写会报异常
RandomAccessFileraf = newRandomAccessFile("D:\\random.txt","r");
//获取文件指针位置
sop(raf.getFilePointer());//0;
int n = 1;
raf.seek(12*n);//设置文件指针的位置,在操作过程当中我们可以规定每个人的姓名和年龄所占的字节数,
//这样一来我能就能同过seek方法方便读出每个人的名字和年龄,想要读第几个人的名字,只需改变n的值即可
sop(raf.getFilePointer());//12;
//在用RandomAccessFile读取数据时一定要,按照数据的大小格式来读取,后则会出错
byte[] b =new byte[8];
raf.read(b);
//跳过指定的字节数,只能往后跳,往后跳8个字节,即此时读取的年龄是后一个人的年龄
//raf.skipBytes(12);
//获取文件指针位置
sop(raf.getFilePointer());//
int age = raf.readInt();
sop("name:"+new String(b)+" age :: "+ age);
//获取文件指针位置
sop(raf.getFilePointer());
}
//往文件中写入数据
public static void writeFile() throws IOException {
RandomAccessFileraf = newRandomAccessFile("D:\\random.txt","rw");
//获取文件指针位置
sop(raf.getFilePointer());
//存入一个人得名字和年龄,为了方便读取,每个人的名字为八个字节,年龄用int的数据
raf.write("liao li ".getBytes());
//write(int)方法只是将int的低八位写入,所以当int大于255是就会丢失数据,所以此时要将int转成四个字节再依次写入,或用特定的方法写入
//raf.write(258);
raf.writeInt(258);
//存入一个人得名字和年龄
raf.write("majingyu".getBytes());
raf.writeInt(223);
//存入一个人得名字和年龄
raf.write("zeng zhi".getBytes());
raf.writeInt(222);
//获取文件指针位置
sop(raf.getFilePointer());
}
//随机写文件
public static void writeFile_2() throws IOException {
//"rw"操作模式下RandomAccessFile在创建对象时,如果传入的文件不存在,则会创建文件
//,若存在,则不会创建,既不会覆盖原文件。,但是写入是是从0指针位置开始的,写入的时候会覆盖,如不想覆盖原内容,
//则可以同过Seek或者skipBytes方法逃过指定的内容在写入
RandomAccessFileraf = newRandomAccessFile("D:\\random.txt","rw");
//逃过36个字节在写入数据,即相当于在原有数据后面续写数据
raf.seek(12*3);
//存入一个人得名字和年龄
raf.write("xiaoqing".getBytes());
raf.writeInt(200);
//如果要改变某个人得信息也很方便只需要,设置指针位置,在改变即可例如改变第三个人的姓名
raf.seek(12*2);
raf.write("lizhikai".getBytes());
}
public static void sop(Object o){
System.out.println(o);
}
}
RandomAccessFile可以看出可以分段往文件中写入数据,这样我们在实际操作中可以通过将要写入的数据分成几个不方,每个部分的写入用以个单独的线程来控制,则这样会大大提高效率。实际上这就是下载的原理。