目录
前言
在一个文本文件的结尾添加一些数据,仔细一听。这个问题很是简单。先把数据读出来,然后再修改读出的数据,再把它写进文件。咋一看,还真是那么简单。但是如果文件由1个G大小,勉勉强强好像没什么问题。但是,我可能要处理20G的文件怎么办?我的电脑内存只有8G,完全没辙啊。一次下面引入RandomAccessFile的方法。
完成上面的需求,如果用RandomAccessFile的话,完全可以实现0内存追加。先看一下这个类的一些功能吧。
RandomAccessFile优势:
RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。
区别于普通IO读取,RandomAccessFile多了两个比较重要的方法
方法名 | 作用 |
getFilePointer() | 返回文件记录指针的当前位置 |
seek(long pos) | 将文件记录指针定位到pos的位置 |
接下来用代码完成追加的功能:
添加
//在文件末尾添加内容
public static void append(String path) throws IOException {
/**
* mode各个参数详解
* r 代表以只读方式打开指定文件
* rw 以读写方式打开指定文件
* rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
* rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
*
* **/
RandomAccessFile randomAccessFile = new RandomAccessFile(path,"rw");
long end = randomAccessFile.length();
randomAccessFile.seek(end);
// char[] buff = new char[100];
randomAccessFile.write("this is test!".getBytes());
randomAccessFile.close();
}
原始的文件内容:
添加之后的:
任意位置插入
原始的类中并没有提及在任意位置插入的功能,但是,我们可以通过提供的功能封装任意位置插入的功能,需要建立一个临时文件,具体实现如下:
//随意位置插入
public static void insert(String path,long pos) throws IOException {
RandomAccessFile file = new RandomAccessFile(path,"rw");
long size = file.length();
if (pos>=size){
throw new IndexOutOfBoundsException("当前插入位置超过了文件尾部");
}
//新建临时文件
File ttt = new File("tmp");
RandomAccessFile tmpFile = new RandomAccessFile(ttt,"rw");
byte[] tmp = new byte[1024];
file.seek(pos);
tmpFile.seek(0);
int tmpsize=0;
long pos1 =pos;
long pos2=0;
//取出插入位置之后的数据,放入临时文件
while ((tmpsize=file.read(tmp))>0){
tmpFile.write(tmp,0,tmpsize);
pos1+=tmpsize;
pos2+=tmpsize;
tmpFile.seek(pos2);
file.seek(pos1);
}
byte[] buff = "insertHere!".getBytes();
file.seek(pos);
file.write(buff);
pos1 = pos + buff.length;
pos2=0;
file.seek(pos1);
tmpFile.seek(pos2);
//将临时文件数据加入源文件尾部
while ((tmpsize=tmpFile.read(tmp))>0){
file.write(tmp,0,tmpsize);
pos1+=tmpsize;
pos2+=tmpsize;
tmpFile.seek(pos2);
file.seek(pos1);
}
file.close();
//删除临时文件
ttt.delete();
tmpFile.close();
}
原始
之后
扩展:
其实,我们在下载的时候,下载器也会新建一个临时文件,等下载结束后,把文件名改成真实的文件名,利用的也是这个功能。用户下载的时候通过数据中的文件指针信息,实现断点续传的功能。