亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

RandomAccessFile的常見用法

標簽:
Java

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的最常用的操作

首先创建一个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();    }}


5.总结

从以上分析可以看出RandomAccessFile最大两个特点:

1.可以指定位置开始操作;

2.既可以读,也可以写;

所以,我们但凡遇到不是需要从文件中中间部分开始读取的时候,可以使用RandomAccessFile这个类,比如:多线程下载是最常用的应该场景

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消