zoukankan      html  css  js  c++  java
  • 随机访问类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();
    }
    }
    }
  • 相关阅读:
    xxx
    04消息队列zmq的发布者-订阅者的计算π的简单程序。
    03网络编程从之异步服务器
    03Python网络编程之多线程服务端。
    03Python网络编程之单线程服务端
    03Python网络编程之客户端。
    03Python网络编程系列之服务端
    02select监听客户端
    02select监听服务端
    07爬虫之-urllib总结
  • 原文地址:https://www.cnblogs.com/archie2010/p/2085405.html
Copyright © 2011-2022 走看看