本帖最后由 我是楠楠 于 2018-6-11 09:59 编辑
【郑州校区】RandomAccessFile的常见用法
1.RandomAccessFile的简介1.1为什么要用到RandomAccessFile
我们平常创建流对象关联文件,开始读文件或者写文件都是从头开始的,不能从中间开始,如果是开多线程下载一个文件我们之前学过的FileWriter或者FileReader等等都无法完成,而当前介绍的RandomAccessFile他就可以解决这个问题,因为它可以指定位置读,指定位置写的一个类,通常开发过程中,多用于多线程下载一个大文件. 1.2.常用方法简介
构造方法:RandomAccessFile raf = newRandomAccessFile(File file, String mode); 其中参数 mode 的值可选 "r":可读,"w" :可写,"rw":可读性; 成员方法: seek(int index);可以将指针移动到某个位置开始读写; setLength(long len);给写入文件预留空间: 2.RandomAccessFile的特点和优势这个对象有两个优点 1.既可以读也可以写
RandomAccessFile不属于InputStream和OutputStream类系的它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是自己从头开始规定的,这里面包含读写两种操作 2.可以指定位置读写
RandomAccessFile能在文件里面前后移动,在文件里移动用的seek( ),所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件. 3.通过案例来熟悉RandomAccessFile的最常用的操作[AppleScript] 纯文本查看 复制代码 首先创建一个DownLoadThread的类继承Thread
public class DownLoadThread extends Thread {
private long start;
private File src;
private long total;
private File desc;
/**
*
* @param start
* 开始下载的位置
* @param src
* 要下载的文件
* @param desc
* 要下载的目的地
* @param total
* 要下载的总量
*/
public DownLoadThread(long start, File src, File desc, long total) {
this.start = start;
this.src = src;
this.desc = desc;
this.total = total;
}
@Override
public void run() {
try {
// 创建输入流关联源,因为要指定位置读和写,所以我们需要用随机访问流
RandomAccessFile src = new RandomAccessFile(this.src, "rw");
RandomAccessFile desc = new RandomAccessFile(this.desc, "rw");
// 源和目的都要从start开始
src.seek(start);
desc.seek(start);
// 开始读写
byte[] arr = new byte[1024];
int len;
long count = 0;
while ((len = src.read(arr)) != -1) {
//分三种情况
if (len + count > total) {
//1.当读取的时候操作自己该线程的下载总量的时候,需要改变len
len = (int) (total - count);
desc.write(arr, 0, len);
//证明该线程下载任务已经完毕,结束读写操作
break;
} else if (len + count < total) {
//2.证明还没有到下载总量,直接将内容写入
desc.write(arr, 0, len);
//并且使计数器任务累加
count += arr.length;
} else {
//3.证明改好到下载总量
desc.write(arr, 0, len);
//结束读写
break;
}
}
src.close();
desc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后定义主方法进行文件的测试
public class TestRandomAccess {
public static void main(String[] args) {
//关联源
File src = new File("a.txt");
//关联目的
File desc = new File("b.txt");
//获取源的总大小
long length = src.length();
// 开两条线程,并分配下载任务
new DownLoadThread(0, src, desc, length / 2).start();
new DownLoadThread(length / 2 , src, desc, length - (length / 2)).start();
}
}
4.效果展示a.txt的内容
b.txt的内容 5.总结从以上分析可以看出RandomAccessFile最大两个特点: 1.可以指定位置开始操作; 2.既可以读,也可以写; 所以,我们但凡遇到不是需要从文件中中间部分开始读取的时候,可以使用RandomAccessFile这个类,比如:多线程下载是最常用的应该场景
传智播客·黑马程序员郑州校区地址 河南省郑州市高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话0371-56061160 / 61/62 来校路线地铁一号线梧桐街站A口出
|