一、RandomAccessFile类
RandomAccessFile
声明在java.io
包下,但直接继承于java.lang.Object
类。并且它实现了DataInput
、DataOutput
这两个接口,也就意味着这个类既可以读也可以写。RandomAccessFile
类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。支持只访问文件的部分内容,也可以向已存在的文件后追加内容。RandomAccessFile
对象包含一个记录指针,用以标示当前读写处的位置。long getFilePointer()
获取文件记录指针的当前位置。void seek(long pos)
将文件记录指针定位到pos
位置。
二、RandomAccessFile类的构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
创建 RandomAccessFile
类实例需要指定一个 mode
参数,该参数指定 RandomAccessFile
的访问模式:
r
: 以只读方式打开rw
:打开以便读取和写入rwd
:打开以便读取和写入;同步文件内容的更新rws
:打开以便读取和写入;同步文件内容和元数据的更新
如果模式为只读r
。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw
读写。如果文件不存在则会去创建文件,如果存在则不会创建,则会对原有文件内容进行覆盖,默认从头开始覆盖。
三、RandomAccessFile实现数据的读写操作
读写操作实现复制文件
@Test
public void test(){
RandomAccessFile randomAccessFile1 = null;
RandomAccessFile randomAccessFile2 = null;
try {
randomAccessFile1 = new RandomAccessFile(new File("04.PNG"),"r");
randomAccessFile2 = new RandomAccessFile(new File("07.PNG"),"rw");
byte[] buffer = new byte[1024];
int len;
while ((len = randomAccessFile1.read(buffer)) != -1){
randomAccessFile2.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (randomAccessFile2 != null)
randomAccessFile2.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (randomAccessFile1 != null)
randomAccessFile1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
实现数据的插入
@Test
public void test1(){
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile("file1.txt","rw");
randomAccessFile.seek(3); //将指针调到角标为3的位置
//保存指针3后面的所有数据到StringBuilder中
StringBuilder stringBuilder = new StringBuilder((int)new File("file1.txt").length());
byte[] buffer = new byte[20];
int len;
while ((len = randomAccessFile.read(buffer)) != -1){
stringBuilder.append(new String(buffer,0,len));
}
//调回指针,写入需要插入的数据
randomAccessFile.seek(3);
randomAccessFile.writeUTF("jian");
//将Stringbuilder中的数据写入到文件中
randomAccessFile.writeUTF(stringBuilder.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (randomAccessFile != null)
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}