Java PDF文件流传输过程中速度很慢,如何解决?
专栏集锦,大佬们可以收藏以备不时之需:
Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9
Python 专栏:http://t.csdnimg.cn/hMwPR
Redis 专栏:http://t.csdnimg.cn/Qq0Xc
TensorFlow 专栏:http://t.csdnimg.cn/SOien
Logback 专栏:http://t.csdnimg.cn/UejSC
量子计算:
量子计算 | 解密著名量子算法Shor算法和Grover算法
AI机器学习实战:
AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析
AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别
Python实战:
Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别
Spring Cloud实战:
Spring Cloud实战 |分布式系统的流量控制、熔断降级组件Sentinel如何使用
Spring Cloud 实战 | 解密Feign底层原理,包含实战源码
Spring Cloud 实战 | 解密负载均衡Ribbon底层原理,包含实战源码
1024程序员节特辑文章:
1024程序员狂欢节特辑 | ELK+ 协同过滤算法构建个性化推荐引擎,智能实现“千人千面”
1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力
1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”
1024程序员节特辑 | OKR VS KPI谁更合适?
1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作
Spring实战系列文章:
Spring实战 | Spring AOP核心秘笈之葵花宝典
Spring实战 | Spring IOC不能说的秘密?
国庆中秋特辑系列文章:
国庆中秋特辑(八)Spring Boot项目如何使用JPA
国庆中秋特辑(七)Java软件工程师常见20道编程面试题
国庆中秋特辑(六)大学生常见30道宝藏编程面试题
国庆中秋特辑(五)MySQL如何性能调优?下篇
国庆中秋特辑(四)MySQL如何性能调优?上篇
国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现
国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作
国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词
目录
- 1、如何解决
- 2、BufferedInputStream、BufferedOutputStream 和InputStream、OutputStream区别是什么
- BufferedInputStream 和 BufferedOutputStream 的特点
- 缓冲的优势
- 示例
- InputStream 和 OutputStream 的基础
- 示例
- 区别总结
- 3、Apache Commons IO、Netty等专业的文件传输库
- Apache Commons IO
- 核心特性
- 示例
- Netty
- 核心特性
- 示例
- 结论
Java PDF文件流传输过程中速度很慢,如何解决
在Java中,PDF文件流传输速度慢可能是由于多种因素造成的,包括网络带宽、服务器处理能力、客户端处理速度、文件大小以及传输过程中的数据处理方式等。以下是一些提高PDF文件流传输速度的策略和方法:
1、如何解决
-
优化PDF文件:
- 在传输之前,对PDF文件进行优化,比如压缩图片、删除不必要的元数据、合并小文件等,以减少文件大小。
-
使用缓冲流:
- 如前所述,使用
BufferedInputStream
和BufferedOutputStream
可以提高I/O操作的效率。在读取和写入文件时,通过缓冲区减少实际的I/O操作次数。
- 如前所述,使用
-
分块传输:
- 对于大文件,可以将其分成多个较小的块进行传输。这样可以避免一次性加载整个文件,减少内存占用,并且可以在传输过程中更灵活地处理错误和中断。
-
多线程处理:
- 在服务器端,可以使用多线程来同时处理多个文件传输请求。这样可以充分利用服务器的多核处理能力,提高整体的文件处理速度。
-
异步传输:
- 对于客户端,可以实现异步下载机制。这样用户可以在下载文件的同时进行其他操作,提高用户体验。
-
网络优化:
- 确保网络连接稳定且带宽足够。如果可能,使用更快的网络连接,或者在网络状况较好的时段进行文件传输。
-
服务器端性能优化:
- 确保服务器有足够的资源来处理文件传输。这可能包括增加内存、使用更快的硬盘(如SSD)、优化服务器配置等。
-
客户端性能优化:
- 在客户端,确保有足够的内存和处理能力来接收和处理文件流。如果客户端性能不足,也可能导致传输速度慢。
-
使用专业的文件传输库:
- 考虑使用如Apache Commons IO、Netty等专业的文件传输库,这些库可能提供了更高效的文件处理和传输机制。
-
监控和调试:
- 使用性能分析工具来监控文件传输过程,找出瓶颈所在,并针对性地进行优化。
-
HTTP/2或WebSocket:
- 如果是通过网络传输,可以考虑使用HTTP/2协议,它提供了更高效的传输方式,如头部压缩、服务器推送等。WebSocket也可以用于实现实时的、全双工的通信,适合于需要持续传输数据的场景。
-
CDN和负载均衡:
- 对于高流量的应用,可以考虑使用内容分发网络(CDN)来缓存文件,以及使用负载均衡技术分散请求压力。
-
数据压缩:
- 在传输前对数据进行压缩,然后在客户端解压缩。这可以减少传输的数据量,但需要注意的是,压缩和解压缩过程本身也会消耗一定的计算资源。
-
流式处理:
- 对于PDF文件,可以实现流式处理,即在读取文件的同时进行解析和渲染,这样可以减少内存占用,并且可以更快地向用户展示文件内容。
-
错误处理和重试机制:
- 实现合理的错误处理和重试机制,以应对网络波动或服务器故障。这样可以确保传输的可靠性,避免因错误而导致的重复传输。
-
用户反馈和调整:
- 收集用户反馈,了解传输过程中遇到的问题,并根据反馈进行调整。用户的实际体验是衡量传输性能的重要指标。
通过上述方法的综合应用,可以显著提高PDF文件流传输的速度和效率。在实施这些策略时,需要根据具体的应用场景和环境进行调整,以达到最佳的性能表现。
2、BufferedInputStream、BufferedOutputStream 和InputStream、OutputStream区别是什么
BufferedInputStream 和 BufferedOutputStream 的特点
BufferedInputStream
和 BufferedOutputStream
是 Java I/O 库中的两个类,它们继承自 FilterInputStream
和 FilterOutputStream
,分别为 InputStream
和 OutputStream
提供了缓冲功能。缓冲是一种性能优化技术,它通过减少实际的 I/O 操作次数来提高数据传输的效率。
缓冲的优势
-
减少 I/O 操作:缓冲区允许一次性读取或写入多个字节,而不是每次操作都与底层系统交互,这样可以减少磁盘或网络 I/O 的次数。
-
提高效率:对于大量数据的读写操作,使用缓冲可以显著提高效率,因为它减少了系统调用的次数。
-
支持标记和重置:
BufferedInputStream
支持mark()
和reset()
方法,允许你标记流中的一个位置,并在之后重置到该位置。这对于需要回溯数据流的场景非常有用。
示例
// 使用 BufferedInputStream 读取文件
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.pdf"))) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {// 处理读取到的数据}
} catch (IOException e) {e.printStackTrace();
}
// 使用 BufferedOutputStream 写入文件
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.pdf"))) {byte[] data = ...; // 要写入的数据bos.write(data);bos.flush(); // 确保所有数据都被写入
} catch (IOException e) {e.printStackTrace();
}
InputStream 和 OutputStream 的基础
InputStream
和 OutputStream
是 Java I/O 库中的抽象基类,它们定义了读取和写入字节流的基本方法。这些类不提供缓冲功能,每次读写操作都会直接与底层数据源交互。
示例
// 使用 InputStream 读取文件
try (InputStream is = new FileInputStream("example.pdf")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {// 处理读取到的数据}
} catch (IOException e) {e.printStackTrace();
}
// 使用 OutputStream 写入文件
try (OutputStream os = new FileOutputStream("output.pdf")) {byte[] data = ...; // 要写入的数据os.write(data);
} catch (IOException e) {e.printStackTrace();
}
区别总结
-
缓冲:
BufferedInputStream
和BufferedOutputStream
提供了缓冲功能,而InputStream
和OutputStream
不提供。 -
性能:由于缓冲,
BufferedInputStream
和BufferedOutputStream
在处理大量数据时通常比InputStream
和OutputStream
更高效。 -
标记和重置:
BufferedInputStream
支持标记和重置操作,而InputStream
不支持。BufferedOutputStream
的标记和重置功能取决于其底层输出流。 -
使用场景:对于需要频繁读写操作的场景,推荐使用
BufferedInputStream
和BufferedOutputStream
。对于一次性或小量数据操作,可以直接使用InputStream
和OutputStream
。 -
内存消耗:缓冲会消耗额外的内存,因此在使用
BufferedInputStream
和BufferedOutputStream
时,需要考虑内存资源的合理分配。 -
API 兼容性:
BufferedInputStream
和BufferedOutputStream
继承自FilterInputStream
和FilterOutputStream
,因此它们可以与任何InputStream
或OutputStream
兼容。
在实际开发中,根据应用的具体需求和资源限制,合理选择使用 BufferedInputStream
、BufferedOutputStream
、InputStream
或 OutputStream
,以达到最佳的性能和资源利用率。
3、Apache Commons IO、Netty等专业的文件传输库
Apache Commons IO
Apache Commons IO 是一个专注于I/O操作的Java库,它提供了一系列简化文件读写、流操作、文件过滤、文件比较等功能的工具类。Apache Commons IO的目标是提供一个易于使用的、跨平台的I/O工具集。
核心特性
-
文件读写:提供了一系列工具类,如
FileUtils
,用于文件的复制、移动、删除、重命名等操作,以及文件内容的读写。 -
流操作:提供了
IOUtils
类,用于处理流的关闭、复制、转换等操作。 -
文件过滤:提供了文件过滤器接口和实现,可以用于文件搜索和匹配。
-
文件比较:提供了文件比较的工具,可以比较两个文件的内容是否相同。
-
临时文件处理:提供了创建和管理临时文件的工具。
示例
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;public class CommonsIOExample {public static void main(String[] args) {try {// 使用 FileUtils 复制文件File source = new File("source.txt");File destination = new File("destination.txt");FileUtils.copyFile(source, destination);// 使用 IOUtils 复制流InputStream in = ...; // 输入流OutputStream out = new FileOutputStream("output.txt");IOUtils.copy(in, out);IOUtils.closeQuietly(in); // 安静地关闭流IOUtils.closeQuietly(out); // 安静地关闭流} catch (IOException e) {e.printStackTrace();}}
}
Netty
Netty 是一个高性能的异步事件驱动的网络应用程序框架,它提供了对TCP、UDP和文件传输的支持,以及作为基础的多种协议实现。Netty广泛应用于服务器和客户端网络通信,特别是在需要高吞吐量和低延迟的场景中。
核心特性
-
异步非阻塞:Netty 使用异步非阻塞的方式处理网络事件,这使得它能够处理大量的并发连接。
-
事件驱动:Netty 的核心是一个事件循环,它负责监听和处理网络事件,如连接、数据读取、数据发送等。
-
通道和处理器:Netty 使用通道(Channel)和处理器(ChannelHandler)的概念来处理网络数据。通道代表了网络连接,处理器则负责处理通道中的事件。
-
协议支持:Netty 提供了多种协议的实现,如HTTP、WebSocket、SSL/TLS等。
-
可扩展性:Netty 的架构设计允许用户自定义协议和扩展其功能。
示例
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;public class NettyServerExample {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new StringDecoder(), new StringEncoder(), new NettyServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);// 绑定端口,开始接收进来的连接b.bind(8080).sync().channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}
}class NettyServerHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {System.out.println("Server received: " + msg);ctx.writeAndFlush("Server echo: " + msg);}
}
这个简单的Netty服务器示例展示了如何创建一个基本的服务器,它监听8080端口,并为每个连接创建一个新的NettyServerHandler
实例来处理接收到的消息。
结论
Apache Commons IO 和 Netty 是两个非常强大的库,它们在不同的场景下有着广泛的应用。Apache Commons IO 更侧重于文件和流的简单操作,而 Netty 则专注于高性能的网络通信。在选择合适的库时,应考虑应用的具体需求、性能要求以及开发团队的熟悉程度。
相关文章:

Java PDF文件流传输过程中速度很慢,如何解决?
专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…...

MCU最小系统晶振模块设计
单片机的心脏:晶振 晶振模块 单片机有两个心脏,一个是8M的心脏,一个是32.768的心脏 8M的精度较低,所以需要外接一个32.768khz 为什么是8MHZ呢,因为内部自带的 频率越高,精度越高,功耗越大&am…...

ELK及ELFK排错
目录 一、ELK及ELFK排错思路 1.1filebeat侧排查 1.2logstash侧排查 1.3ES、kibana侧问题 一、ELK及ELFK排错思路 1.1filebeat侧排查 第一步:排查filebeat上的配置文件有没有写错,filebeat的配置文件是yml文件,一定要注意格式。 第二步…...

『Django』创建app(应用程序)
theme: smartblue 本文简介 点赞 关注 收藏 学会了 在《『Django』环境搭建》中介绍了如何搭建 Django 环境,并且创建了一个 Django 项目。 在刚接触 Django 时有2个非常基础的功能是需要了解的,一个是“app”(应用程序),另一个是 url(路由…...

Docker安装(一)
一、安装Docker 服务器系统:centos 7 1.本地有docker的首先卸载本机docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \dock…...
由于bug发现的现象
//********************************* 示例1 ******************************* $flag (float)2; var_dump($flag); if ($flag 2) { } var_dump($flag);//输出结果 float(2) int(2)//********************************* 示例2 ******************************* $flag (floa…...

ES源码四:网络通信层流程
听说ES网络层很难?今天来卷它😄 前言 ES网络层比较复杂,分为两个部分: 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块(NetworkModule) 入口还是上一章的创建Node构造方法的地方…...

贝锐蒲公英自研异地组网新技术:远程视频监控,流畅度、清晰度大幅提升
在远程视频监控过程中,若遇到网络带宽若遇到网络波动,如:丢包、高延迟等,往往会导致视频流传输时发生数据丢失或延迟现象,从而严重影响视频画面的清晰度和流畅度。 比如:在公司总部集中监看远程矿山或户外水…...

C# aspose word实现模板方式打印及打印速度慢解决方法
1.引用dll nuget或者网上都有下载的方式。不过都要收费。下载地址:https://files.cnblogs.com/files/rolayblog/Tool.zip?t1713322422&downloadtrue 2.打印模板设计 新建一个doc文档,根据自己的需求画页面。 A、普通文本 在word中需要替换值的地方添…...
java纯文字游戏
java纯文字小游戏 package Test2;import java.util.Random;public class Role {private String name ;private int blood;private char gender;private String face;public Role() {}public Role(String name, int blood) {this.name name;this.blood blood;}public String …...

mac IDEA激活 亲测有效
1、官网下载mac版本IDEA并安装 2、打开激活页面 3、下载脚本文件 链接: https://pan.baidu.com/s/1I2BqdfxSJv1A96422rflnA?pwdm494 提取码: m494 4、命令行到该界面,执行 sudo bash idea.sh 可能出现的问题: 查看sh文件,targetFilePath…...
视频怎么去水印,轻松去视频水印的方法
视频水印是为了提高视频的版权保护能力,防止视频被盗用或者不正当使用,但另一方面会破坏视频的流畅度和清晰度,很影响视觉观感和后续创作。想要去除视频水印,下面三种方法你必须得知道,赶紧看过来~ 1、使用美图秀秀(A…...
vue3+element+AntDesign(自动导入)+pina+vite+js+pnpm搭建项目框架
vue3elementAntDesign(自动导入)pinavitejspnpm搭建项目框架 文章目录 vue3elementAntDesign(自动导入)pinavitejspnpm搭建项目框架1. 安装pnpm:通过以下命令安装pnpm,它是一个快速、零配置的包管理工具。2. 初始化项目:在命令行中执行以下命…...

Android Studio XML 预览View 底部移动到右边
以前 XML 的预览都是在右边的,最近不知道为什么突然到下面去了,很不习惯 找半天想把 预览view 移动到右边,一直没找到按钮。 误打误撞移回来了,原来只要再点击一次 split,就可以变动位置了,记录一下。...

计算机网络——实现smtp和pop3邮件客户端
实验目的 运用各种编程语言实现基于 smtp 协议的 Email 客户端软件。 实验内容 1. 选择合适的编程语言编程实现基于 smtp 协议的 Email 客户端软件。 2. 安装 Email 服务器或选择已有的 Email 服务器,验证自己的 Email 客户端软件是否能进行正常的 Email 收发功…...
【Spring】面试题汇总
Spring1. 什么是 Spring 框架?2. 谈谈你对于 Spring IoC 的了解3. 什么是依赖注入4. Spring的依赖注入有几种方式5. 将一个类声明为 Bean 的注解有哪些?6. Component 和 Bean 的区别是什么?7. 注入 Bean 的注解有哪些?8. Bean 的作用域有哪些?9. Bean…...
thinkphp6入门(23)-- 如何导入excel
1. 安装phpexcel composer require phpoffice/phpexcel composer update 2. 前端 <form class"forms-sample" action"../../xxxx/xxxx/do_import_users" method"post" enctype"multipart/form-data"><div class"cont…...

【数据结构3-栈和队列】
数据结构3-栈和队列 1 栈-特殊的线性表-先进后出1.1 栈的三个案例 2 队列-与栈相反-先进先出2.1 队列的案例 3 用C实现栈的代码:4 用C实现队列的代码 1 栈-特殊的线性表-先进后出 1.1 栈的三个案例 2 队列-与栈相反-先进先出 2.1 队列的案例 3 用C实现栈的代码&…...

STL--list双向链表
功能 将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成 结点的组成:一个是存储数据元素的数据域࿰…...

ElasticSearch入门篇
简介 ElasticSearch简介:简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...