一个输入流同时写出到多个输出流

在有一部分传输的时候,为了效率我们需要将一个输入流中的数据异步写出到多个输出流里面,Java 自带的IO/NIO并没有这个功能,自己实现的具体流程图如下:

可以想到,如果达到这个效果,我们需要将输入流中的读出的byte[] 保存到内存中,之后再由输出流读取,如果希望输入流输出流互不干涉完全异步,那么我们就需要每个输出流一个线程来实现,输入流不停地向缓冲区队列里面写数据,不用管输出流怎么读,直到所有数据读完。

输入流在第一次读数据之后输出流开始启动,输出流监控这个缓冲队列,如果有数据就读取,没有数据就进入wait状态。这里我是这样实现的:输出流在从缓冲区中读取并写出一个数据块之后,即进入wait状态,如果发现输入流已经读取完了所有数据就不必要wait了;输入流在读取一个数据块之后,notify一次所有的输出流线程,从而达到这个效果。

这个原理不难看出,如果我们不对这个缓冲区定时清理的话,那么它必然会达到整个输入流所有数据量的大小,也就是说,如果输入流是一个文件,那么最终这个文件会被完全读取到内存中,如果情况特殊这个文件有几个G,那么内存就会崩掉,所以我们需要定时的去清理这个缓冲区,如果一个数据块已经被所有输出流线程读取过了,那么我们就可以将它从内存中移除掉,让JVM自动回收掉。注意我这里的描述,是所有输出线程全部读取过,如果情况特殊有一个输出流线程进入卡死或者等待状态,那么依然会出现上述情况。之前准备用双向循环链表来实现这个缓冲区,这样清理会比较快一点,但是LinkedList将它的核心Node对象封装起来了,退而求其次我这里就用hashMap来实现的。

具体实现起来还有很多小问题,我已经在代码里面相应的地方给出清楚的注释了,有兴趣的话可以去我的资源里面下载:

http://download.csdn.net/detail/zhwwanwan/7762977

一个输入流同时写出到多个输出流,布布扣,bubuko.com

时间: 2024-10-29 00:19:35

一个输入流同时写出到多个输出流的相关文章

今天完成一篇特殊的作文:写出《公司手册》的每个字

上周就给自己本周末定一个任务:写出公司手册第一版.定了计划就要完成. 现在是周日下午,在上海中山地铁内的麦当劳,吃完16元的套餐(本来是15元,我要求把冰可乐换成热红茶),开始写作. 这是一篇特殊的作文,我将阐述我创办公司过程中形成的理念.我要组建的团队灵魂.公司产品带给用户的价值,浓缩到<公司手册>中.公司文化,最早一定起源于创始人的思想和行为方式. 也许以后有更专业的人继续完善.发展公司文化和公司手册,现在我要记录一个优秀公司的初心和青涩思想. 铀尼公司员工手册 超级表格隶属的铀尼公司,是

java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

1 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.

写出一个缓存系统的伪代码001

/** * 写出一个缓存系统的伪代码 * @author ysloong * */ public class CacheDemo { private Map<String, Object> map = new HashMap<String, Object>(); public static void main(String[] args) { // TODO Auto-generated method stub } public synchronized Object getDat

2.3为方便旅客,某航空公司拟开发一个机票预定系统。 写出问题定义并分析系统的可行性。

为方便旅客,某航空公司拟开发一个机票预定系统.旅行社把预定机票的旅客信息(姓名.性别.工作单位.身份证号码.旅行时间.旅行目的地等)输入进 入该系统,系统为旅客安排航班,印出取票通知和账单,旅客在飞机起飞的前一天凭取票通知和账单交款取票,系统校对无误即印出机票给旅客. 写出问题定义并分析系统的可行性. 1>     目标:在一个月内建立一个高效率,无差错的航空公司机票预定系统 2>     存在的主要问题:人工不易管理,手续繁琐 3>     建立新系统 ①  经济可行性        

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

条款25:考虑写出一个不抛异常的swap函数

条款25:考虑写出一个不抛异常的swap函数 swap函数在C++中是一个非常重要的函数,但实现也非常复杂. 看一个缺省的std::swap函数的实现 namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } } ①内置类型的调用 int a = 2; int b =3; std::swap(a, b); cout<<"a:&quo

如何写出一个好的宝贝标题

先说下今天的内容哪些人不用看,做标品的不用看了,请点击浏览器右上角叉叉. 因为关于标题优化这块,做标品类目的没什么好讲的词,词太少,把行业所有热词往宝贝标题上一堆,标题就算完成了,可能所有热词堆上去之后,都还没有满30个字符.标品的标题优化就这么简单,我一句话就讲完了. 好了,进入今天的正题 非标品的标题优化思路 写标题的核心思路是让宝贝最大程度的获取自然流量 很多人觉得标题不重要,因为如果销量都没有,你再怎么样优化标题都没用! 这句话完全正确! 但是,有了销量之后呢? 今天的主题分两部分讲  

做一个具有图片读入,写出,灰度化,黑白化的有图形界面的小软件

我们这一次的树莓基础的作业是做一个做一个具有图片读入,写出,灰度化,黑白化的小软件,我采用的是java,因为java有大量性能非常好的接口可用,譬如在图片这块,ImageIO,BufferedImage都是非常好用的,而我这一次作业也是使用这两个包. 首先我们要解决的是界面,界面可以直接用JFrame来打, 非常简单,我的界面有一个菜单栏和一个图片显示区,菜单栏有三个选项:文件,转换,保存,文件菜单有一个子菜单:打开文件,转换菜单有两个子菜单:变成灰度和变成黑白,保存菜单有三个子菜单:jpg,

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e