随机存取文件流
简介
-
RandomAccessFile声明在java.io包下, 但直接继承于java.lang.Object类。 并且它实现了Datalnput. DataOutput这两 个接口,也就意味着这个类既可以读也可以写。
-
RandomAccessFile类支持“随机访问"的方式,程序可以直接跳到文件的任意地方来读、写文件
- 支持只访间文件的部分内容
- 可以向已存在的文件后追加内容
-
RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。
-
RandomAccessFile类对象可以*移动记录指针:
- long getFilePointer(): 获取文件记录指针的当前位置
- void seek(long pos): 将文件记录指针定位到pos位置
构造器
- public RandomAccessFile(File file, String mode)
- public RandomAccessFile(String name, String mode)
创建RandomAccessFile类实例需要指定一个mode参数,该参数指定RandomAccessFile的访问模式:
- r:以只读方式打开
- rw:打开以便读取和写入
- rwd:打开以便读取和写入;同步文件内容的更新
- rws:打开以便读取和写入:同步文件内容和元数据的更新
如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为w读写。如果文件不存在则会去创建文件,如果存在则不会创建。
样例
复制文件
package com.dreamcold.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Demo20 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf1= new RandomAccessFile(new File("image.jpg"),"r");
RandomAccessFile raf2= new RandomAccessFile(new File("image4.jpg"),"rw");
byte[] buffer=new byte[1024];
int len;
while((len=raf1.read(buffer))!=-1){
raf2.write(buffer,0,len);
}
raf1.close();
raf2.close();
}
}
效果:
写入txt文件
如果RandomaccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建
如果写出到的文件存在,则会对原有文件内容进行覆盖。|
package com.dreamcold.io;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Demo21 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf1=new RandomAccessFile("hello1.txt","rw");
raf1.write("dreamcold".getBytes());
raf1.close();
}
}
效果:
数据插入的效果
可以通过相关的操作,实现RandomAccessFile"插入重据的效果
package com.dreamcold.io;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Demo22 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf1=new RandomAccessFile("hello1.txt","rw");
//将指针调到角标为3的位置
raf1.seek(3);
//保存指针3之后的所有的数据到StringBuilder中
StringBuilder builder=new StringBuilder();
byte[] buffer=new byte[20];
int len;
while ((len=raf1.read(buffer))!=-1){
builder.append(new String(buffer,0,len));
}
//调回指针写入"xyz"
raf1.seek(3);
raf1.write("xyz".getBytes());
//将StringBuiler中的数据写入文件
raf1.write(builder.toString().getBytes());
raf1.close();
}
}
结果: