java的RandomAccessFile提供对文件的读写功能,与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。
实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针 ; 输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开 始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException (是一种 IOException )。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException ,而不是 EOFException 。需要特别指出的是,如果流已被关闭,则可能抛出 IOException 。
在JDK 1.4中,RandomAccessFile的绝大多数功能(但不是全部)已经被nio内存映射文件给取代了。
Java的RandomAccessFile类方法:
方法描述
void close()关闭此随机访问文件流并释放与该流关联的所有系统资源。
FileChannelgetChannel()返回与此文件关联的唯一 FileChannel 对象。
FileDescriptorgetFD()返回与此流关联的不透明文件描述符对象。
longgetFilePointer()返回此文件中的当前偏移量,用来查找当前所处的位置。
long length()返回此文件的长度。
int read()从此文件中读取一个数据字节
int read(byte[] b)将最多 b.length 个数据字节从此文件读入 byte 数组。
int read(byte[] b,int off,int len)将最多 len 个数据字节从此文件读入 byte 数组。
boolean readBoolean()从此文件读取一个 boolean。
byte readByte()从此文件读取一个有符号的八位值。
char readChar()从此文件读取一个字符
double readDouble()从此文件读取一个 double。
float readFloat()从此文件读取一个 float。
void readFully(byte[] b)将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。
void readFully(byte[] b,int off,int len)将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。
int readInt()从此文件读取一个有符号的 32 位整数。
String readLine()从此文件读取文本的下一行。
long readLong()从此文件读取一个有符号的 64 位整数。
short readShort()从此文件读取一个有符号的 16 位数。
int readUnsignedByte()从此文件读取一个无符号的八位数
int readUnsignedShort()从此文件读取一个无符号的 16 位数。
String readUTF()从此文件读取一个字符串。
void seek(long pos)设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
void setLength(long newLength)设置此文件的长度。
int skipBytes(int n)尝试跳过输入的 n 个字节以丢弃跳过的字节。
void write(byte[] b)将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
void write(byte[] b, int off, int len)将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。
void write(int b)向此文件写入指定的字节。
void writeBoolean(boolean v)按单字节值将 boolean 写入该文件。
void writeByte(int v)按单字节值将 byte 写入该文件
void writeBytes(String s)按字节序列将该字符串写入该文件。
void writeChar(int v)按双字节值将 char 写入该文件,先写高字节。
void writeChars(String s)按字符序列将一个字符串写入该文件。
void writeDouble(double v)使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。
void writeFloat(float v)使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四字节数量将该 int 值写入该文件,先写高字节。
void writeInt(int v)按四个字节将 int 写入该文件,先写高字节。
void writeLong(long v)按八个字节将 long 写入该文件,先写高字节
void writeShort(int v)按两个字节将 short 写入该文件,先写高字节。
void writeUTF(String str)使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。
Java的RandomAccessFile案例:
文件指针从头开始写入package com.qunar.bean;
import java.io.File;
import java.io.RandomAccessFile;
import java.util.Arrays;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
// 判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
// 读写方式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// write 从当前指针开始写入,写入一个字节
randomAccessFile.write('A');
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
randomAccessFile.write('B');
int num = 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 = new byte[(int)randomAccessFile.length()];
randomAccessFile.read(buffer);
for (byte b : buffer) {
// 16进制输出
System.out.print(Integer.toHexString(b)+" ");
}//for
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
指定任意文件指针位置写入package com.qunar.bean;
import java.io.File;
import java.io.RandomAccessFile;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
// 判断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
// 读写方式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
// 写值
for(int i = 0;i
randomAccessFile.writeInt(i);
}//for
// 将文件指针移到第二个Int值后
randomAccessFile.seek(2*4);
// 覆盖第三个Int值
randomAccessFile.writeInt(6);
// 文件指针指向文件开头
randomAccessFile.seek(0);
// 输出
for (int i = 0;i
System.out.print(randomAccessFile.readInt()+" ");
}//for
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
从任意文件指针位置读取package com.qunar.bean;
import java.io.File;
import java.io.RandomAccessFile;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(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 (Exception e) {
e.printStackTrace();
}
}
}