博客信息

IO流之RandomAccessFile类(可用来实现迅雷视频分片下载)

发布时间:『 2019-06-16 05:04』  博客类别:java基础  阅读(976)

随机操作文件,这个IO流对象与其他流对象不一样,不属于字节流也不属于字符流,继承于Object独自成为一个IO流派系

 

该类不算是IO体系中子类;

而是直接继承自Object

 

但是它是IO包中成员,因为它具备读和写功能;

内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer获取指针位置;同时可以通过seek改变指针的位置;

 

 

其实完成读写的原理就是内部封装了字节输入流和输出流;

 

通过构造函数可以看出,该类只能操作文件;

而且操作文件还有模式,只读r,读写rw等;

 

如果模式为只读r,不会创建文件,会去读取一个已存在文件,如果该文件不存在,则会出现异常,如果模式rw,操作的文件不存在,会自动创建,如果存在则不会覆盖;

 

该流对象的作用在于,可以将一个数据文件,分段用多线程进行下载

 

小李飞刀_IO流


下面模拟一个对单视频多线程下载的案例

 

线程类


package com.javaxl.io.other;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-16 9:10
 */
public class DownLoadThread extends Thread{
    //线程id
    private int threadId;
    private int StartPos;
    private int EndPos;
    private String FileURL;
    private File SaveFile;

    public DownLoadThread(int threadId, int StartPos, int EndPos, String FileURL, File SaveFile){
        this.threadId = threadId;
        this.StartPos = StartPos;
        this.EndPos = EndPos;
        this.FileURL = FileURL;
        this.SaveFile = SaveFile;
    }

    @Override
    public void run() {
        try {
            InputStream is = new FileInputStream(FileURL);
                int len = 0;
                byte[] buf = new byte[1024];
                RandomAccessFile raf = new RandomAccessFile(SaveFile, "rw");
                raf.seek(StartPos);
                while((len = is.read(buf)) > 0) {
                    raf.write(buf, 0, len);
                }
                is.close();
                System.out.println("线程" + threadId + "下载完毕!!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


主线程方法


package com.javaxl.io.other;

import java.io.*;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-16 9:10
 *
 * 要十分注意StartPos 和 EndPos 设置
 */
public class DownloadFile {
    public final static String FileURL = "C:\\1、树形组件tree讲解.mp4";
    public final static int COUNT = 5;      //分段数
    public static File SaveFile;

    public static void main(String[] args) throws IOException {
        method_COUNT();
    }

    public static void method_COUNT() throws IOException {
        int position = FileURL.lastIndexOf("\\");
        String fileName = FileURL.substring(position + 2);   //文件名
        System.out.println("file name is :" + fileName);

        File file = new File(FileURL);
        long FileLength = file.length();
        System.out.println("文件总长度为:" + FileLength);

        SaveFile = new File("C:\\partFiles\\" + fileName);
        RandomAccessFile raf = new RandomAccessFile(SaveFile, "rw"); //若没有该文件,则自动创建
        raf.setLength(FileLength);  //设置文件长度
        raf.close();

        //分块大小
        long blockSize = FileLength / COUNT;
        for (int i = 0; i <= COUNT; i++) {
            Long StartPos = i * blockSize;
            Long EndPos = (i + 1) * blockSize - 1;

            //最后一条线程EndPos = FileLength
            if (i == COUNT) {
                EndPos = FileLength;
            }
            System.out.println("线程" + i + "下载的部分为:" + StartPos + "---" + EndPos);
            new DownLoadThread(i, StartPos.intValue(), EndPos.intValue(), FileURL, SaveFile).start();
        }
    }
}


控制台截图


小李飞刀_IO流



对应的视频也下载到了C:\partFiles\1、树形组件tree讲解.mp4





关键字:     Java基础       IO流       RandomAccessFile类  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有