首页 > 其他分享 >NIO文件复制+RateLimiter限流

NIO文件复制+RateLimiter限流

时间:2022-10-17 20:15:49浏览次数:38  
标签:1024 NIO MAX source 限流 static target RateLimiter

/**
 * 平衡工具类
 *
 * @author lucky
 * @date 2022-09-29
 */
@Slf4j
public class BalanceUtil {
      /**
     * 最大传输字节数 4MB
     */
    final static int MAX_COUNT = 4 * 1024 * 1024;

    /**
     * 最大传输速度 150MB/s
     */
    final static double MAX_SPEED = 150.0d * 1024 * 1024;

    private static final RateLimiter RATE_LIMITER = RateLimiter.create(MAX_SPEED / MAX_COUNT);
  
  
  /**
     * 复制文件
     * NIO是一种基于通道和缓冲区的io方式,它可以使用native函数直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer
     * 对象作为这块内存的直接引用进行操作。这样能在一些场景显著提高性能,因为避免了在java堆和native堆中来回复制数据。
     *
     * @param source 源
     * @param target 目标
     * @param flag   标志
     */
    public static void copyFile(String source, String target, Boolean flag) throws IOException {
        long l = 0;
        if (flag) {
            log.info("正在复制:{} -----> {}", source, target);
            l = System.currentTimeMillis();
        }

        try (FileChannel from = new RandomAccessFile(source, "rw").getChannel();
             FileChannel to = new RandomAccessFile(target, "rw").getChannel()) {

            long size = from.size();
            long position = 0;
            while (position < size) {
                if (RATE_LIMITER.tryAcquire()) {
                    position += from.transferTo(position, MAX_COUNT, to);
                }
            }
        }

        if (flag) {
            log.info("用时: {}", (System.currentTimeMillis() - l) + "ms");
        }
    }
}

标签:1024,NIO,MAX,source,限流,static,target,RateLimiter
From: https://www.cnblogs.com/Zm-Lucky/p/16800411.html

相关文章

  • springboot集成minio及服务安装
    @​​TOC​​​​​​本文只介绍如何将minio做成服务​​1.将minio做成服务将MinioServer.exe放在minio安装目录中同目录下创建MinioServer.xml。特别注意,xml和exe必须同名......
  • Java NIO——缓冲区Buffer
    基本介绍缓冲区(Buffer):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能......
  • winioctl.h(10326): [C4668] 没有将“_WIN32_WINNT_WIN10_TH2”定义为预处理器宏,用
    一般为Windows中的宏和UE4冲突所致在模块的xxx.Build.cs里面添加这个:bEnableUndefinedIdentifierWarnings=false;转自:https://blog.csdn.net/boonti/article/detail......
  • windows minio服务安装以及springboot集成
    @​​TOC​​​​​​本文只介绍如何将minio做成服务​​1.将minio做成服务将MinioServer.exe放在minio安装目录中同目录下创建MinioServer.xml。特别注意,xml和exe必须同名......
  • union all和union的区别用法
    unionall和union的区别:取结果的交集,union对两个结果集进行并集操作,不包括重复行,相当于distinct,同时进行默认规则的排序;unionall:对两个结果集进行并集操作,包括重复行,即所......
  • docker-compose 实现minio分布式存储服务
    minio是一个非常流行的高性能存储服务,云服务器使用得非常多。现在minio的更新非常迅速,三天两头就会更新版本,为了学习minio,了解最近特性,使用docker进行部署安装就非常方便。......
  • Sentinel整合Feign对远程调用限流并降级
    微服务提供者demo-pay第一步:创建模块demo-pay添加依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifa......
  • 电气防火限流式保护器在可燃性粉尘危险场所的应用
    安科瑞陈盼摘要:文章阐述了可燃性粉尘的特点及可燃性粉尘环境粉尘爆炸的危害性,结合国家现行的电气产品规范的要求,通过一个提取车间内部粉尘爆炸危险区域的电气设计实例,系统阐......
  • WARN 404 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound
    WARN404---[nio-8080-exec-1]o.s.web.servlet.PageNotFound       :NomappingforGET/swagger-ui.html  Failedtostartbean'documentationPlu......
  • [Typescript] Get class properties type in union
    Forexamplethereisaclas:exportclassModifierState{/***Returnsthemodifierstateapplicabletothekeyboardeventgiven.*......