发表于 2023-1-19 21:18:02

java多线程-断点续传

package com.qikux.utils;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.concurrent.ConcurrentHashMap;

public class FileUtils {
    /**
   * 支持断点续传
   * @src 拷贝的原文件
   * @desc 拷贝的位置
   * @threadNum 开启的线程数
   */
    public static void transportFile(File src, File desc, int threadNum) throws Exception {
      // 每一个线程读取的大小
      int part = (int)Math.ceil(src.length() / threadNum);
      // 存储多个线程、用于阻塞主线程
      List list = new ArrayList();

      // 定义一个基于多线程 的 hashmap
      final Map map = new ConcurrentHashMap();
      // 读取 日志文件中的数据
      String[] $data = null ;

      String logName = desc.getCanonicalPath() + ".log";

      File fl = new File(logName);

      if (fl.exists()) {
            BufferedReader reader = new BufferedReader(new FileReader(fl));
            String data = reader.readLine();
            // 拆分 字符串
            $data = data.split(",");
            reader.close();
      }

      final String[] _data = $data ;

      for (int i = 0; i < threadNum; i++) {
            final int k = i ;
            Thread thread = new Thread(() -> {
                // 线程具体要做的事情
                RandomAccessFile log = null ;
                try {
                  RandomAccessFile in = new RandomAccessFile(src, &quot;r&quot;);
                  RandomAccessFile out = new RandomAccessFile(desc, &quot;rw&quot;);

                  log = new RandomAccessFile(logName, &quot;rw&quot;);
                  // 从指定位置读
                  in.seek(_data ==null ?k * part : Integer.parseInt(_data) );
                  out.seek(_data ==null ?k * part : Integer.parseInt(_data) );

                  byte[] bytes = new byte;
                  int len = -1, plen = 0;

                  while (true) {
                        len = in.read(bytes);

                        if (len == -1) {
                            break;
                        }
                        // 如果不等于 -1 , 则 累加求和
                        plen += len;

                        // 将读取的字节数,放入 到 map 中
                        map.put(k,plen + (_data ==null ?k * part : Integer.parseInt(_data)) );

                        // 将读取到的数据、进行写入
                        out.write(bytes, 0, len);
                        // 将 map 中的数据进行写入文件中
                        log.seek(0); // 直接覆盖全部文件
                        StringJoiner joiner = new StringJoiner(&quot;,&quot;);
                        map.forEach((key, val)-> joiner.add(String.valueOf(val)));
                        log.write(joiner.toString().getBytes(StandardCharsets.UTF_8));

                        if (plen + (_data ==null ? k * part : Integer.parseInt(_data)) >= (k+1) * part ) {
                            break;
                        }
                  }
                } catch (Exception e) {
                  e.printStackTrace();
                }finally {
                  try {
                        if (log !=null) log.close();
                  } catch (IOException e) {
                        e.printStackTrace();
                  }
                }

            });
            thread.start();
            // 把这5个线程保存到集合中
            list.add(thread);
      }
      for(Thread t : list) {
            t.join(); // 将线程加入,并阻塞主线程
      }
      // 读取完成后、将日志文件删除即可
      new File(logName).delete();
    }

    /**
   * 支持断点续传
   * @src 拷贝的原文件
   * @desc 拷贝的位置
   */
    public static void transportFile(File src, File desc) throws Exception {
      transportFile(src, desc, 5);
    }

    public static void transportFile(String src, String desc) throws Exception {
      transportFile(new File(src), new File(desc));
    }
}


资源下载地址和密码(百度云盘):**** Hidden Message ***** 百度网盘信息回帖可见



本资源由Java自学网收集整理【www.javazx.com】

shuying36 发表于 2023-1-19 21:28:04

好,很好,非常好!

ZYFHYC 发表于 2023-1-20 09:38:18

java多线程-断点续传

castle21 发表于 2023-1-25 11:39:41

站长加油 看好你

zhou007 发表于 2023-2-6 23:08:56

不错 高清晰

deron8 发表于 2023-2-19 15:35:41

楼猪V5啊

jiexiadewo 发表于 2023-3-12 16:03:59

赞赞赞!!

2014520 发表于 2023-4-2 12:56:03

好资源

携手共进 发表于 2023-4-17 21:46:27

多谢楼主 收下了

Icheon_Tao 发表于 2023-4-24 23:39:20

it视频教程网 你牛
页: [1] 2 3 4 5 6 7 8
查看完整版本: java多线程-断点续传