Java IO. RandomAccessFile
RandomAccessFile 是IO体系中功能强大的文件内容访问类,声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了DataInput、DataOutput这两个接口,它提供了众多的方法来访问文件内容,既可以读也可以写。与普通的IO流不同的是,RandomAccessFile 支持"随机访问",程序可以直接跳转到文件的任意地方来读写数据。
构造方法:
- public RandomAccessFile(File file, String mode): 创建随机访问文件流,从File参数指定的文件中读取,也可以选择写入。
- public RandomAccessFile(String name, String mode):创建随机访问文件流,从具有指定名称的文件中读取,也可以选择写入。
参数mode指定RandomAccessFile的访问模式:
- r: 以只读方式打开。
- rw:打开支持读取和写入。
- rwd:打开支持读取和写入,并且同步文件内容的更新。
- rws:打开支持读取和写入;并且同步文件内容和元数据的更新。
如果模式为只读r,会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。如果模式为读写rw,如果文件存在会直接操作,如果文件不存在则会去创建文件。
指针位置相关方法:
- long getFilePointer():获取文件记录指针的当前位置
- void seek(long pos):将文件记录指针定位到pos位置
1、实现数据的读写操作
RandomAccessFile可以作为一个输入流,也可以作为一个输出流
当其作为输出流时,入伙写出到的文件不存在,则在执行过程中自动创建。如果写出到的文件存在,则会对原有文件内容进行覆盖(默认从头覆盖)。
import java.io.*;
public class RandomAccessFileTest {
public static void main(String[] args) {
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\test.txt", "r");//只读
raf2 = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\test1.txt", "rw");//可读写
System.out.println("当前的RandomAccessFile的初始指针位置是:" + raf1.getFilePointer());
//设置文件指针的偏移量
raf1.seek(4);
System.out.println("设置偏移量之后的指针位置是:" + raf1.getFilePointer());
int len;
byte[] bytes = new byte[1024];
while ((len = raf1.read(bytes)) != -1) {
String str = new String(bytes, 0, len, "gbk");
raf2.write(bytes, 0, len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf1 != null){
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(raf2 != null){
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
程序运行结果:
2、实现数据的插入操作
可以通过相关的操作,实现RandomAccessFile“插入”数据的效果。
public class RandomAccessFileTest {
public static void main(String[] args) {
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\test.txt", "rw");
System.out.println("当前的RandomAccessFile的初始指针位置是:" + raf.getFilePointer());
//设置文件指针的偏移量
raf.seek(6);
System.out.println("设置偏移量之后的指针位置是:" + raf.getFilePointer());
//保存指针6后面的所有数据到StringBuilder中
StringBuilder builder = new StringBuilder((int) new File("C:\\Users\\Administrator\\Desktop\\test.txt").length());
int len;
byte[] bytes = new byte[1024];
while ((len = raf.read(bytes)) != -1) {
builder.append(new String(bytes,0,len,"gbk"));
}
//调回指针,写入“插入语句”
raf.seek(6);
raf.write("插入语句".getBytes("gbk"));
//将StringBuilder中的数据写入到文件中
raf.write(builder.toString().getBytes("gbk"));
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf != null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果: