RandomAccessFile
文件的随机访问指的是我们可以对文件访问任意位置的信息。而这个文件类就是 RandomAccessFile 。
关键成员变量以及方法:
fileponiter : 文件指针,用来标记当前读取或者写入的位置。
getFileponiter() :返回当前文件指针的位置
seek() :设置当前文件指针的位置
构造器:
RandomAccessFile(String pathname , String mode);
RandomAccessFile(File file ,String mode);
第一个构造器,指定路径,内部创建一个File,给定模式。
第二个构造器,给定File,给定模式。
那么RandomAccessFile的模式有哪些呢?
r:只支持读取
rw:支持读取和写入
rwd:支持读取和写入的同时,当我们修改文件内容和文件的元数据都会直接同步到存储设备上
rws:支持读取和写入,同时当我们修改文件内容会直接同步到存储设备上
(tips:文件的元数据:文件的大小,访问权限,本身的一些属性等等)
示例:
public static void main(String[] args) {
//我们对c.txt的内容进行随机访问,然后写入到d.txt;
RandomAccessFile randomAccessFile = null;
File src = new File("./c.txt");
File dest = new File("./d.txt");
FileOutputStream fileoutputStream = null;
try {
fileoutputStream = new FileOutputStream(dest);
//对src文件进行随机访问,权限为只读
//如果设置为rw模式我们还可以写入数据
randomAccessFile = new RandomAccessFile(src,"r");
byte[] buf = new byte[1024];
int hasRead = 0;
//打印文件指针现在的位置
System.out.println(randomAccessFile.getFilePointer());
//设置文件指针为50,把文件指针移动到50字节处
randomAccessFile.seek(50);
//此时是从c.txt的50字节处开始复制到d.txt。
while(( hasRead = randomAccessFile.read(buf))!= -1) {
fileoutputStream.write(buf);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
randomAccessFile.close();
fileoutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
RandomAccessFile不能在任意位置去追加数据
因为 RandomAccessFile 的 write()方法,实在 filepointer 的位置覆盖写入,不能在任意位置去插入数据。