目录
文件输入输出流类(FileInputStream和FileOutputStream)实现了对磁盘文件的顺序读写,然而在实际的应用中,经常需要在文件的任意位置读或写数据,并且要求同时进行读和写操作。为此,Java还提供了一个功能更强大、使用更方便的RandomAccessFile类,该类可以实现对文件的随机读写。RandomAccessFile类定义在java.io包中,它与InputStream和OutputStream类在一个层次,是Object类的直接子类。RandomAccessFile类支持文件任意位置的读取而不只是顺序读取。
1. 构造方法
RandomAccessFile类的构造方法如下:
RandomAccessFile(String name, String mode) | 通过指定的文件名来创建随机访问文件对象 |
RandomAccessFile(File file, String mode) | 过指定的File对象来创建随机访问文件对象 |
其中,参数mode表示对文件的访问模式,其取值如下:
- “r”:表示以只读的方式打开文件,如果调用对象的写操作将会导致抛出IOException异常;
- “rw”:表示以读写的方式打开文件,如果文件不存在,则尝试创建新的文件;
- “rwd”:表示以读写的方式打开文件,相对于“rw”模式,还要求对文件内容的更新同步写入到基础存储设备中;
- “rws”:表示以读写的方式打开文件,相对于“rw”模式,还要求对文件的内容或元数据的更新都同步写入到基础存储设备中。
创建RandomAccessFile对象时,如果指定的文件不存在则会抛出FileNotFoundException异常,因此,在RandomAccessFile对象时需要增加相应的try-catch语句。
例如,
RandomAccessFile rafile; try { rafile=new RandomAccessFile("D:\\examples\\book.txt","rwd"); } catch (FileNotFoundException e) { e.printStackTrace(); } |
2. 文件指针
为了支持对文件的随机读写,RandomAccessFile类设置了文件指针,该指针以字节位单位,通过从文件头开始计算的偏移量来指明当前读写的位置。RandomAccessFile类提供了如下方法来操作文件的指针:
long getFilePointer() | 返回文件指针的当前位置 |
void seek(long pos) | 将文件指针定位到pos位置 |
int skipByte(int n) | 跳过输入流中的n个字节不读,并返回实际跳过的字节数。 |
long length() | 返回文件的长度 |
文件的位置从0开始,通过seek()方法可以将指针指向任何位置。
例如,
rafile.writeInt(10); //向文件中写入一个整型值(长度为4) rafile.writeDouble(20.15);//向文件写入一个双精度浮点值(长度为8) System.out.println("len="+rafile.length());//len=12 rafile.seek(4);//将文件定位到位置4 System.out.println(rafile.readDouble());//20.5 |
3. 读写操作
RandomAccessFile类除了提供了与InputStream和OutputStream类似的read()和write()方法外,还提供了直接读写各种基本类型数据的方法。
RandomAccessFile类中用于读文件操作的主要方法如下:
方法 | 功能描述 |
int read() | 从文件的当前位置开始读取一个字节的数据 |
int read(byte[] b) | 从文件的当前位置开始读取最多b.length个字节的数据存储在数组b中,并返回实际读取的字节数 |
int read(byte[] b, int off, int len) | 从文件的当前位置中读取最多len个字节的数据存放到字节数组b中从off开始的位置,并返回实际读取的字节数 |
boolean readBoolean() | 从文件当前位置开始读取一个布尔值 |
char readChar() | 从文件当前位置开始读取一个字符 |
byte readByte() | 从文件当前位置开始读取一个byte类型的值 |
short readShort() | 从文件当前位置开始读取一个短整型值 |
int readInt() | 从文件当前位置开始读取一个整型值 |
long readLong() | 从文件当前位置开始读取一个长整型值 |
float readFloat() | 从文件当前位置开始读取一个单精度浮点数 |
double readDouble() | 从文件当前位置开始读取一个双精度浮点数 |
String readUTF() | 从文件当前位置开始读取一个UTF格式的字符串 |
String readLine() | 从文本文件当前位置开始读取一行 |
RandomAccessFile类中用于写文件操作的主要方法如下:
方法 | 功能描述 |
void write(int b) | 向文件写入指定的字节数据 |
void write(byte[] b) | 将b.length个字节从指定的byte数组中写入到文件中 |
void write(byte[] b, int off, int len) | 将一个指定的byte数组中从off开始的len个字节写入文件中 |
void writeBoolean() | 在文件的当前位置写入一个布尔值 |
void writeByte(int v) | 在文件的当前的位置写入一个byte型值(只写入v的最低位字节) |
void writeBytes(String s) | 按照字节序列的形式将一个字符串写入文件的当前位置 |
void writeChar(int v) | 在文件的当前位置写入一个字符(只写入v的最低2位字节) |
void writeChars(String s) | 按照字符序列的形式将一个字符写入文件的当前位置 |
void writeShort(int v) | 在文件的当前位置写入一个短整型值(只写入v的最低2位字节) |
void writeInt(int v) | 在文件的当前位置写入一个整型值 |
void writeLong(long v) | 在文件的当前位置写入一个长整型值 |
void writeFloat(float v) | 在文件的当前位置写入一个单精度浮点值 |
void writeDouble(double v) | 在文件的当前位置写入一个双精度浮点值 |
void writeUTF(String str) | 在文件的当前位置写入一个UTF格式的字符串,其长度是2个字节的长度信息加上字符串所占字节数(英文字符的长度为1个字节,中文汉字的长度为3个节) |
4. 应用示例
下面程序创建一个文本文件,然后利用RandomAccessFile类写入3个学生的信息,然后再将其读取出来写在控制台中。
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
public static void main(String[] args) {
try {
RandomAccessFile accessFile=new
RandomAccessFile("D:\\examples\\student.txt","rwd");
long pos[]=new long[3];
pos[0]=0;//第1个学生的初始位置
accessFile.writeInt(1);
accessFile.writeUTF("张三");
accessFile.writeDouble(90);
pos[1]=accessFile.getFilePointer();//第2个学生初始位置
accessFile.writeInt(2);
accessFile.writeUTF("李四");
accessFile.writeDouble(80);
pos[2]=accessFile.getFilePointer();//第3个学生初始位置
accessFile.writeInt(3);
accessFile.writeUTF("王五");
accessFile.writeDouble(75);
for(int i=0;i<3;i++) {
accessFile.seek(pos[i]);//移到第i个学生初始位置
int no=accessFile.readInt();
String name=accessFile.readUTF();
double score=accessFile.readDouble();
System.out.println("编号:"+no+",姓名:"+name+",分数:"+score);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
程序运行结果如下:
编号:1,姓名:张三,分数:90.0
编号:2,姓名:李四,分数:80.0
编号:3,姓名:王五,分数:75.0
标签:文件,Java,int,读写,位置,写入,RandomAccessFile,随机,void From: https://blog.csdn.net/hitmengfanchao/article/details/136963003