• 随机访问类RandomAccessFile多线程下载


    随机访问类RandomAccessFile

    输入流FileInputStream和输出流 FileOutputStream,实现的是对磁盘文件的顺序读写,而且读写要分别创建不同对象。

    相比之下RandomAccessFile类则可对文件实现随机读写操作。
    RandomAccessFile对象的文件位置指针遵循下面的规律:
    ·新建RandomAccessFile对象的文件位置指针位于文件的开头处;
    ·每次读写操作之后,文件位置的指针都相应后移到读写的字节数;
    ·可以通过getFilePointer方法来获得文件位置指针的位置,通过seek方法来设置文件指针的位置。
    如果某个文件有30个字节,读取数据过程中,从20-30读取,用skip( )//跳过方法,但在读取的过程中,前面的字节都被删除掉了,

    如果用户有这样的需求,先读取10-20字节,之后再读1-10之间的数,再20-30之间,

    多线程下载

    public void threadDownLoad(String path,int threadSize) throws Exception{
    URL url
    = new URL(path);
    HttpURLConnection connection
    = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod(
    "GET");
    if(connection.getResponseCode() != 200){
    throw new RuntimeException("ResponseCode != 200");
    }
    //要下载的总大小
    int dataLength = connection.getContentLength();
    connection.disconnect();
    //线程数
    threadSize = threadSize == 0 ? 5 : threadSize;
    threadSize
    = dataLength % threadSize == 0 ? threadSize : threadSize+1;
    //每个线程块要下载的数量
    int blockSize = dataLength / threadSize;
    String newFileName
    = rename(path);
    System.out.println(
    ""+threadSize+"个线程开始下载");
    for(int i=0;i<threadSize;i++){
    RandomAccessFile accessFile
    = new RandomAccessFile(newFileName, "rw");
    int startSize =blockSize * i;
    accessFile.seek(startSize);
    Thread thread
    = new Thread(new DownLoad(startSize, path, blockSize, accessFile,i+1));
    thread.start();
    }
    }

    定义的线程下载类

    private class DownLoad implements Runnable{
    private String path;
    private RandomAccessFile accessFile;
    private int startSize;
    private int blockSize;
    private int threadName;
    public DownLoad(int startSize,String path,int blockSize,RandomAccessFile accessFile,int threadName) {
    this.path = path;
    this.accessFile = accessFile;
    this.startSize = startSize;
    this.blockSize = blockSize;
    this.threadName = threadName;
    }
    @Override
    public void run() {
    try {
    System.out.println(
    "线程"+threadName+"开始下载.....");
    URL url
    = new URL(path);
    HttpURLConnection connection
    = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod(
    "GET");
    connection.setReadTimeout(
    6*1000);
    connection.setRequestProperty(
    "Range", "bytes=" + startSize + "-");
    if(connection.getResponseCode()!=206){
    throw new RuntimeException("ResponseCode != 206");
    }
    InputStream inputStream
    = connection.getInputStream();
    inputStream
    = new BufferedInputStream(inputStream);
    byte[] buffer = new byte[1024];
    int len = -1;
    int length = 0;
    while(length < blockSize && ((len = inputStream.read(buffer)) != -1)){
    accessFile.write(buffer,
    0, len);
    length
    += len;
    }
    accessFile.close();
    inputStream.close();
    connection.disconnect();
    System.out.println(
    "线程"+threadName+"下载成功!");
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
  • 相关阅读:
    tiny4412 串口驱动分析八 --- log打印的几个阶段之内核启动阶段(printk tiny4412串口驱动的注册)
    tiny4412 串口驱动分析七 --- log打印的几个阶段之内核启动阶段(earlyprintk)
    tiny4412 串口驱动分析六 --- TTY驱动架构
    Android简单的利用SoundPool进行播放铃声的实例代码
    Android简单的利用MediaRecorder进行录音的实例代码
    tiny4412 串口驱动分析五 --- LDD3上TTY驱动程序源码
    tiny4412 串口驱动分析四 --- 修改默认的串口输出
    tiny4412 串口驱动分析三 --- log打印的几个阶段之内核自解压
    tiny4412 串口驱动分析二 --- printk的实现
    tiny4412 串口驱动分析一 --- u-boot中的串口驱动
  • 原文地址:https://www.cnblogs.com/archie2010/p/2085405.html
Copyright © 2020-2023  润新知