上一节我们说到通过File访问文件,但是我们访问文件的最终目的都是访问文件中的内容,那么这个时候我们就需要使用到的一个类就是:RandomAccessFile。
此类的定义如下:
public class RandomAccessFile extends Object
implements DataOutput,DataInput,Closeable
此类的实例支持对随机访问文件的读取和写入。该操作方法通过一种文件指针的方式表示当前访问的位置,可以通过seek方法重置。需要注意的是流操作在结束之后都需要关闭。
构造方法:
RandomAccessFile(File file,String mode):创建从中读取和向其中写入(可选)的随机访问文件流
RandomAccessFile(String name,String mode):创建从中读取和向其中写入(可选)的随机访问文件流
mode参数指定访问模式,包括:
“r”:以只读方式打开
“rw”:打开以便读取和写入,如果该文件不存在,则会尝试创建该文件
“rws”:打开以便读取和写入,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备
“rwd”:打开以便读取和写入,还要求对文件内容的每个更新都同步写入到底层存储设备
主要操作方法:
1. | void close | 关闭随机访问文件流并释放与该流关联的所有系统资源 |
2. | long getFilePointer() | 返回此文件中的当前偏移量 |
3. | long length() | 返回此文件的长度 |
4. | int read() | 从此文件读取一个字节 |
5. | int read(byte[] b,int off,int len) | 将最多len个数据字节从此文件读入byte数组 |
6. | boolean readBoolean() | 从此文件读取一个boolean |
7. | byte readByte() | 从此文件读取一个有符号的八位值 |
8. | char readChar() | 从此文件读取一个字符 |
9. | double readDouble() | 从此文件读取一个double |
10. | float readFolat() | 从此文件读取一个float |
11. | void readFully(byte[] b) | 将b.length个字节从此文件读入byte数组,并从当前文件指针开始 |
12. | void readFully(byte[] b,int off,int len) | 将正好len哥字节从此文件读入byte数组,并从当前文件指针开始 |
13. | int readInt() | 从此文件读取一个有符号的32位证书 |
14. | String readLine() | 从此文件读取文本的下一行 |
15. | long readLong() | 从此文件读取一个有符号的64位整数 |
16. | short readShort() | 从此文件读取一个有符号的16位数 |
17. | void seek(long pos) | 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作 |
18. | int skipBytes(int n) | 尝试跳过输入的n个字节以丢弃跳过的字节 |
19. | void write(byte[] b) | 将b.length个字节从指定byte数组写入到此文件并从当前文件指针开始 |
20. | void write(byte[] b,int off,int len) | 将len个字节从指定byte数组写入到此文件,并从偏移量off处开始 |
21. | void write(int b) | 想此文件写入指定的字节 |
22. | void writeBoolean(boolean v) | 按单字节值将boolean写入该文件 |
23. | void writeByte(int v) | 按单字节值将byte写入该文件 |
24. | void wirteBytes(String s) | 按字节序列将该字符串写入该文件 |
25. | void writeChar(int v) | 按双子姐将char写入该文件,先写高字节 |
26. | void writeChars(String s) | 按字符序列将一个字符串写入该文件 |
27. | void writeDouble(double v) |
使用Double类的doubleToLongBits方法将双精度参数转换为一个long,然后按八字节数量将该long值写入该文件,先写高字节 |
28. | void writeFloat(float v) | 使用Float类的floatToIntBits方法将浮点参数转换为一个int,然后按四字节数量将该int值写入该文件先写高字节 |
29. | void writeInt(int v) | 按四个字节将int写入该文件,先写入高字节 |
30. | void writeLong(long v) | 按八个字节将short写入该文件,先写入高字节 |
31. | void writeShort(int v) | 按两个字节将short写入该文件,先写入高字节 |
32 | void writeUTF(String str) | 使用UTF-8编码以与机器无关的方式将一个字符串写入文件 |
实例:
实例:
package com.fuwh.raf; import java.io.RandomAccessFile; public class RadomAccessFileWrite { public static void main(String[] args) throws Exception {
//实现对classpaths下的文件raf.txt实现写入
String name="zhangsan";
int age=12;
float salary=5500.15f;
String dept="Java开发"; RandomAccessFile raf=new RandomAccessFile("raf.txt","rw");
raf.writeBytes(name);
raf.writeInt(age);
raf.writeFloat(salary);
raf.write(dept.getBytes());
raf.close(); RandomAccessFile raf2=new RandomAccessFile("raf.txt","r");
byte[] b=new byte[8];
raf2.read(b);
System.out.println(new String(b));
System.out.println(raf2.readInt());
System.out.println(raf2.readFloat());
byte[] c=new byte[8];
for(int i=0;i<8;i++){
c[i]=raf2.readByte();
}
System.out.println(new String(c));
raf2.close();
}
}
通过这个实例,明显可以感觉到,这样的操作非常的不灵活,因此我们就需要使用到java.io包中的其他一些列io操作类