您的位置:首页 > 编程语言 > Java开发

[Java开发之路](7)RandomAccessFile类详解

2015-12-23 21:04 495 查看
RandomAccessFile适用于大小已知的记录组成的文件,提供的对文件访问,既可以读文件,也可以写文件,并且支持随机访问文件,可以访问文件的任意位置。文件中记录的大小不一定都相同,只要我们知道记录的大小和位置。但是该类仅限于操作文件。

RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分。除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个继承层次结构没有任何关系,它甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,从头开始编写其所有的方法(大多数都是本地的)。这么做是因为RandomAccessFile拥有和别的IO类型本质上不同的行为,因为我们可以在一个文件内向前和向后移动。它是一个直接继承Object的,独立的类。

本质上说,RandomAccessFile的工作方式类似于把DataInputStream和DataOutputStream结合起来,还添加了一些方法,其中方法getFilePointer()用来查找当前所处的文件位置,seek()用来在文件内移至新的位置,length()用来判断文件大小。此外,它的构造方法还需要一个参数来表示打开模式(只读方式
r读写方式rw),它不支持只写文件。

只有RandomAccessFile支持搜寻方法(seek()),并且这个方法也只适用于文件。BufferedInputStream却只能允许标注(mark())位置(其值存储在内部某个变量内)和重新设定位置(reset()),但是这些功能有限,不是非常实用。

在JDK1.4中,RandomAccessFile的绝大多数功能(但不是全部)已经被nio内存映射文件给取代了。

方法:

方法描述
voidclose()关闭此随机访问文件流并释放与该流关联的所有系统资源。
FileChannelgetChannel()返回与此文件关联的唯一FileChannel对象。
FileDescriptorgetFD()返回与此流关联的不透明文件描述符对象。
longgetFilePointer()返回此文件中的当前偏移量,用来查找当前所处的位置。
longlength()返回此文件的长度。
intread()从此文件中读取一个数据字节
intread(byte[]b)将最多b.length个数据字节从此文件读入byte数组。
intread(byte[]b,intoff,intlen)将最多len个数据字节从此文件读入byte数组。
booleanreadBoolean()从此文件读取一个boolean。
bytereadByte()从此文件读取一个有符号的八位值。
charreadChar()从此文件读取一个字符
doublereadDouble()从此文件读取一个double。
floatreadFloat()从此文件读取一个float。
voidreadFully(byte[]b)将b.length个字节从此文件读入byte数组,并从当前文件指针开始。
voidreadFully(byte[]b,intoff,intlen)将正好len个字节从此文件读入byte数组,并从当前文件指针开始。
intreadInt()从此文件读取一个有符号的32位整数。
StringreadLine()从此文件读取文本的下一行。
longreadLong()从此文件读取一个有符号的64位整数。
shortreadShort()从此文件读取一个有符号的16位数。
intreadUnsignedByte()从此文件读取一个无符号的八位数
intreadUnsignedShort()从此文件读取一个无符号的16位数。
StringreadUTF()从此文件读取一个字符串。
voidseek(longpos)设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
voidsetLength(longnewLength)设置此文件的长度。
intskipBytes(intn)尝试跳过输入的n个字节以丢弃跳过的字节。
voidwrite(byte[]b)将b.length个字节从指定byte数组写入到此文件,并从当前文件指针开始。
voidwrite(byte[]b,intoff,intlen)将len个字节从指定byte数组写入到此文件,并从偏移量off处开始。
voidwrite(intb)向此文件写入指定的字节。
voidwriteBoolean(booleanv)按单字节值将boolean写入该文件。
voidwriteByte(intv)按单字节值将byte写入该文件
voidwriteBytes(Strings)按字节序列将该字符串写入该文件。
voidwriteChar(intv)按双字节值将char写入该文件,先写高字节。
voidwriteChars(Strings)按字符序列将一个字符串写入该文件。
voidwriteDouble(doublev)使用Double类中的doubleToLongBits方法将双精度参数转换为一个long,然后按八字节数量将该long值写入该文件,先定高字节。
voidwriteFloat(floatv)使用Float类中的floatToIntBits方法将浮点参数转换为一个int,然后按四字节数量将该int值写入该文件,先写高字节。
voidwriteInt(intv)按四个字节将int写入该文件,先写高字节。
voidwriteLong(longv)按八个字节将long写入该文件,先写高字节
voidwriteShort(intv)按两个字节将short写入该文件,先写高字节。
voidwriteUTF(Stringstr)使用modifiedUTF-8编码以与机器无关的方式将一个字符串写入该文件。
案例:

[code]packagecom.qunar.bean;
importjava.io.File;
importjava.io.RandomAccessFile;
importjava.util.Arrays;
publicclassFileDemo{
publicstaticvoidmain(String[]args){
Stringpathname="D:\\Recommendedsystem.txt";
//创建文件实例
Filefile=newFile(pathname);
try{
//判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
//读写方式打开文件
RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
//write从当前指针开始写入,写入一个字节
randomAccessFile.write('A');
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
randomAccessFile.write('B');
intnum=0x7fffffff;
//如果用write方法,每次只能写一个字节,需要写4次
randomAccessFile.write(num>>>24);
randomAccessFile.write(num>>>16);
randomAccessFile.write(num>>>8);
randomAccessFile.write(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
//或者是用writeInt方法一次写入
randomAccessFile.writeInt(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
//文件指针指向文件开头
randomAccessFile.seek(0);
//一次性读取把文件中内容都读到字节数组中
byte[]buffer=newbyte[(int)randomAccessFile.length()];
randomAccessFile.read(buffer);
for(byteb:buffer){
//16进制输出
System.out.print(Integer.toHexString(b)+"");
}//for
randomAccessFile.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}


[code]packagecom.qunar.bean;
importjava.io.File;
importjava.io.RandomAccessFile;
publicclassFileDemo{
publicstaticvoidmain(String[]args){
Stringpathname="D:\\Recommendedsystem.txt";
//创建文件实例
Filefile=newFile(pathname);
try{
//判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
//读写方式打开文件
RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");
//写值
for(inti=0;i<5;++i){
randomAccessFile.writeInt(i);
}//for
//将文件指针移到第二个Int值后
randomAccessFile.seek(2*4);
//覆盖第三个Int值
randomAccessFile.writeInt(6);
//文件指针指向文件开头
randomAccessFile.seek(0);
//输出
for(inti=0;i<5;++i){
System.out.print(randomAccessFile.readInt()+"");
}//for
randomAccessFile.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}


[code]packagecom.qunar.bean;
importjava.io.File;
importjava.io.RandomAccessFile;
publicclassFileDemo{
publicstaticvoidmain(String[]args){
Stringpathname="D:\\Recommendedsystem.txt";
//创建文件实例
Filefile=newFile(pathname);
try{
RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");
//以下向file文件中写数据
//占4个字节
randomAccessFile.writeInt(2015);
//占8个字节
randomAccessFile.writeDouble(12.23);
//占2个字节
randomAccessFile.writeShort(19);
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("欢迎来到小斯的博客");
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
//占2个字节
randomAccessFile.writeChar('Y');
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("小斯的博客欢迎你");
//把文件指针位置设置到文件起始处
randomAccessFile.seek(0);
System.out.println("读取一个Int值:"+randomAccessFile.readInt());
System.out.println("读取一个Double值:"+randomAccessFile.readDouble());
System.out.println("读取一个Short值:"+randomAccessFile.readShort());
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
//将文件指针跳过2个字节
randomAccessFile.skipBytes(2);
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
randomAccessFile.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}


RandomAccessFile适用于大小已知的记录组成的文件,提供的对文件访问,既可以读文件,也可以写文件,并且支持随机访问文件,可以访问文件的任意位置。文件中记录的大小不一定都相同,只要我们知道记录的大小和位置。但是该类仅限于操作文件。

RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分。除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个继承层次结构没有任何关系,它甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,从头开始编写其所有的方法(大多数都是本地的)。这么做是因为RandomAccessFile拥有和别的IO类型本质上不同的行为,因为我们可以在一个文件内向前和向后移动。它是一个直接继承Object的,独立的类。

本质上说,RandomAccessFile的工作方式类似于把DataInputStream和DataOutputStream结合起来,还添加了一些方法,其中方法getFilePointer()用来查找当前所处的文件位置,seek()用来在文件内移至新的位置,length()用来判断文件大小。此外,它的构造方法还需要一个参数来表示打开模式(只读方式
r读写方式rw),它不支持只写文件。

只有RandomAccessFile支持搜寻方法(seek()),并且这个方法也只适用于文件。BufferedInputStream却只能允许标注(mark())位置(其值存储在内部某个变量内)和重新设定位置(reset()),但是这些功能有限,不是非常实用。

在JDK1.4中,RandomAccessFile的绝大多数功能(但不是全部)已经被nio内存映射文件给取代了。

方法:

方法描述
voidclose()关闭此随机访问文件流并释放与该流关联的所有系统资源。
FileChannelgetChannel()返回与此文件关联的唯一FileChannel对象。
FileDescriptorgetFD()返回与此流关联的不透明文件描述符对象。
longgetFilePointer()返回此文件中的当前偏移量,用来查找当前所处的位置。
longlength()返回此文件的长度。
intread()从此文件中读取一个数据字节
intread(byte[]b)将最多b.length个数据字节从此文件读入byte数组。
intread(byte[]b,intoff,intlen)将最多len个数据字节从此文件读入byte数组。
booleanreadBoolean()从此文件读取一个boolean。
bytereadByte()从此文件读取一个有符号的八位值。
charreadChar()从此文件读取一个字符
doublereadDouble()从此文件读取一个double。
floatreadFloat()从此文件读取一个float。
voidreadFully(byte[]b)将b.length个字节从此文件读入byte数组,并从当前文件指针开始。
voidreadFully(byte[]b,intoff,intlen)将正好len个字节从此文件读入byte数组,并从当前文件指针开始。
intreadInt()从此文件读取一个有符号的32位整数。
StringreadLine()从此文件读取文本的下一行。
longreadLong()从此文件读取一个有符号的64位整数。
shortreadShort()从此文件读取一个有符号的16位数。
intreadUnsignedByte()从此文件读取一个无符号的八位数
intreadUnsignedShort()从此文件读取一个无符号的16位数。
StringreadUTF()从此文件读取一个字符串。
voidseek(longpos)设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
voidsetLength(longnewLength)设置此文件的长度。
intskipBytes(intn)尝试跳过输入的n个字节以丢弃跳过的字节。
voidwrite(byte[]b)将b.length个字节从指定byte数组写入到此文件,并从当前文件指针开始。
voidwrite(byte[]b,intoff,intlen)将len个字节从指定byte数组写入到此文件,并从偏移量off处开始。
voidwrite(intb)向此文件写入指定的字节。
voidwriteBoolean(booleanv)按单字节值将boolean写入该文件。
voidwriteByte(intv)按单字节值将byte写入该文件
voidwriteBytes(Strings)按字节序列将该字符串写入该文件。
voidwriteChar(intv)按双字节值将char写入该文件,先写高字节。
voidwriteChars(Strings)按字符序列将一个字符串写入该文件。
voidwriteDouble(doublev)使用Double类中的doubleToLongBits方法将双精度参数转换为一个long,然后按八字节数量将该long值写入该文件,先定高字节。
voidwriteFloat(floatv)使用Float类中的floatToIntBits方法将浮点参数转换为一个int,然后按四字节数量将该int值写入该文件,先写高字节。
voidwriteInt(intv)按四个字节将int写入该文件,先写高字节。
voidwriteLong(longv)按八个字节将long写入该文件,先写高字节
voidwriteShort(intv)按两个字节将short写入该文件,先写高字节。
voidwriteUTF(Stringstr)使用modifiedUTF-8编码以与机器无关的方式将一个字符串写入该文件。
案例:

[code]packagecom.qunar.bean;
importjava.io.File;
importjava.io.RandomAccessFile;
importjava.util.Arrays;
publicclassFileDemo{
publicstaticvoidmain(String[]args){
Stringpathname="D:\\Recommendedsystem.txt";
//创建文件实例
Filefile=newFile(pathname);
try{
//判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
//读写方式打开文件
RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
//write从当前指针开始写入,写入一个字节
randomAccessFile.write('A');
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
randomAccessFile.write('B');
intnum=0x7fffffff;
//如果用write方法,每次只能写一个字节,需要写4次
randomAccessFile.write(num>>>24);
randomAccessFile.write(num>>>16);
randomAccessFile.write(num>>>8);
randomAccessFile.write(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
//或者是用writeInt方法一次写入
randomAccessFile.writeInt(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
//文件指针指向文件开头
randomAccessFile.seek(0);
//一次性读取把文件中内容都读到字节数组中
byte[]buffer=newbyte[(int)randomAccessFile.length()];
randomAccessFile.read(buffer);
for(byteb:buffer){
//16进制输出
System.out.print(Integer.toHexString(b)+"");
}//for
randomAccessFile.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}


[code]packagecom.qunar.bean;
importjava.io.File;
importjava.io.RandomAccessFile;
publicclassFileDemo{
publicstaticvoidmain(String[]args){
Stringpathname="D:\\Recommendedsystem.txt";
//创建文件实例
Filefile=newFile(pathname);
try{
//判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
//读写方式打开文件
RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");
//写值
for(inti=0;i<5;++i){
randomAccessFile.writeInt(i);
}//for
//将文件指针移到第二个Int值后
randomAccessFile.seek(2*4);
//覆盖第三个Int值
randomAccessFile.writeInt(6);
//文件指针指向文件开头
randomAccessFile.seek(0);
//输出
for(inti=0;i<5;++i){
System.out.print(randomAccessFile.readInt()+"");
}//for
randomAccessFile.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}


[code]packagecom.qunar.bean;
importjava.io.File;
importjava.io.RandomAccessFile;
publicclassFileDemo{
publicstaticvoidmain(String[]args){
Stringpathname="D:\\Recommendedsystem.txt";
//创建文件实例
Filefile=newFile(pathname);
try{
RandomAccessFilerandomAccessFile=newRandomAccessFile(file,"rw");
//以下向file文件中写数据
//占4个字节
randomAccessFile.writeInt(2015);
//占8个字节
randomAccessFile.writeDouble(12.23);
//占2个字节
randomAccessFile.writeShort(19);
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("欢迎来到小斯的博客");
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
//占2个字节
randomAccessFile.writeChar('Y');
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("小斯的博客欢迎你");
//把文件指针位置设置到文件起始处
randomAccessFile.seek(0);
System.out.println("读取一个Int值:"+randomAccessFile.readInt());
System.out.println("读取一个Double值:"+randomAccessFile.readDouble());
System.out.println("读取一个Short值:"+randomAccessFile.readShort());
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
//将文件指针跳过2个字节
randomAccessFile.skipBytes(2);
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
randomAccessFile.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: