如何使用管道流?收藏
新一篇: 自定义事件和事件监听器。。。
如何使用管道流?
管道是用来将一个线程的输出流信息传送到另一个线程的输入流中。PipedReader 和PipedWriter (和他们类似的输入输出流PipedInputStream 和PipedOutputStream ) 用来实现一个管道的输入和输出, 为什么这是有用的呢?
考 虑到一个类可能实现一系列的多样的处理功能,如排序、反序文本。如果某个方法的输出能够做为另一个方法的输入,以便于可以把一序列的方法的调用串接起来, 那么这样将可以得到高层次的功能。例如,你可以反序list里每个文字的位置,然后对这些文字进行排序,再反序每个文字来创建一个压韵(可能是按字母顺序 的意思)的list。
如果没有管道流,程序在每一步中只能把当前得到的结果存储在某个临时的位置(比如文件或在内存中)。如下图所示:
没有管道流,程序必须保存中间结果
如果有管道流,那么一个方法的输出可以作为下一个要调用的方法的输入,如下图所示:
通过管道,程序可以把从一个线程传递给另一个。
让我们来看下这个个程序 RhymingWords,它实现是上图所描述得功能。这个程序用管道连接它的反序和排序方法的输入和输出流来创建一个压韵(可能是按字母顺序的意思)的list。这个程序有几个类组成。
首先,让我们来看看main方法中反序和排序方法的调用顺序:
FileReader words = new FileReader("words.txt");
Reader rhymingWords = reverse(sort(reverse(words)));
最里面是调用reverse 方法,并传递一个FileReader对象给它。FileReader对象是打开一个包含一单词列表的文件 words.txt 。reverse 的返回结果传递给sort, sort的返回结果再传递给另一个reverse 方法。
让我们看下reverse这个方法;sort方法也是类似的,一旦你理解了reverse方法,你自然而然会理解sort方法。
public static Reader reverse(Reader src) throws IOException {
BufferedReader in = new BufferedReader(src);
PipedWriter pipeOut = new PipedWriter();
PipedReader pipeIn = new PipedReader(pipeOut);
PrintWriter out = new PrintWriter(pipeOut);
new ReverseThread(out, in).start();
return pipeIn;
}
黑体字的语句声明并初始化一个管道的两端-- PipedWriter
和PipedReader-- 通过PipedWriter对象的基础上创建
ipedReader 对象来实现管道的两端的连接。不管往PipedWriter中写入什么,
都能在PipedReader中读取出来。
管道的连接方法, 如下面的插图所示
使用PipedWriter 和PipedReader 来构件一个管道.
reverse 方法通过启动一个 ReverseThread ,把它的输出(output)
写到PipedWriter 然后把PipedReader返回给调用者。 调用者在通过sort
线程,从管道中读取信息.sort方法除了创建和启动一个SortThread 外,
和reverse方法是非常象的。
分享到:
相关推荐
这种结构允许数据在各个处理阶段之间流动,就像流水线中的物料一样,从而实现高效的数据处理。 在软件设计中,管道常用于数据密集型任务,例如文本处理、图像处理或网络通信。在“kwic”这个文件中,可能包含了一个...
要将这些自由式作业转换为流水线,DevOps工程师将必须手动向下钻取100或1000个作业,了解工具,配置,URL和参数等,并以流水线语法重新编写。 这种手动工作不仅涉及转换单个作业逻辑,而且还需要确保将链转换为单个...
Cluster Flow是在高性能集群环境中自动化和标准化生物信息学分析的流水线工具。 它被设计为易于使用,快速设置和灵活配置。 群集流是用Perl编写的,通过将作业启动到群集来工作(也可以在本地运行)。 每个作业都是...
虽然文档未详细阐述流水作业的具体步骤,但通常情况下,流水作业是指将施工过程分为多个独立的工序,每个工序由专门的团队或工人负责,依次进行,以提高工作效率。 **三、插入式施工** 插入式施工是一种快速施工...
在土方作业中,应遵循挖方段和填方段的流水作业原则,分段进行,防止大开大挖,以保证施工的连续性和合理性。此外,为了后续管道铺设的顺利进行,必须在适当的时间内完成沟槽开挖和管道基础的铺设,形成流水施工模式...
在土方开挖阶段,需要合理规划土方堆放,尤其在面对大量土方工程时,要抓住有利天气,采用流水作业方式,避免大开大挖,以确保工程的连续性和合理性。分段开挖和回填可以减少混乱,为后续的管道铺设创造条件。 管道...
SparkCats项目可能是利用Scala的`cats`库中的Kleisli来构建Spark作业的流水线。通过这种方式,开发者可以编写出更加简洁和可读的代码,同时避免在Spark的分布式计算环境中出现类型错误。IO monad通常用于表示异步或...
这些过滤器通过管道(Pipe)连接起来,形成一个流水线。每个过滤器负责完成特定任务,如数据转换、清洗等,然后将处理后的数据传递给下一个过滤器。 ##### 2. 具体实现 在本项目中,实现了以下几个过滤器组件: - **...
本项目的围堰施工采用了防渗粘土,并采用分段流水作业的方式,以确保各个施工阶段的连续性。 1. **土石料准备**:选用外购的黏土作为筑堰材料,使用挖掘机和自卸汽车进行运输和卸料。 2. **围堰搭建**:根据施工...
每个命令的输出成为下一个命令的输入,形成流水线式的执行模式。 3. **条件控制**:通过BASH的if语句和测试命令,jobgen可以在执行任务时加入条件判断,实现任务的有条件执行。 4. **错误处理**:jobgen支持错误...
这个库以.whl格式发布,方便用户直接安装和使用,无需进行复杂的编译过程。 SparkPipelineFramework的核心理念是简化Spark应用程序的开发流程,通过提供一种声明式的方式来定义和管理数据处理任务。这种框架允许...
7. **作业协调**:同一作业现场的不同作业班组需由项目部统一协调,各班组成员必须服从指挥和管理,合理安排工序间的流水作业,严禁在同一作业面上交叉作业。 #### 三、模板工程安全技术交底 1. **施工方案**:编制...
5. 数据处理流水线:与其他Apache项目(如Hadoop、Kafka)集成,构建端到端的数据处理流程。 三、Spark性能优化 1. 内存管理:合理配置executor内存、shuffle内存,避免频繁的磁盘溢出。 2. 并行度调整:根据硬件...
Spark的另一个重要组件是Spark ML,这是一个现代的、统一的机器学习流水线库,提供了高级的建模和特征工程功能。 在实际项目中,Spark通常与Hadoop生态系统结合使用,例如与HDFS(Hadoop Distributed File System)...
Apache Beam 是一个强大的开源项目,专注于提供统一的编程模型来处理大规模数据,无论是在批处理还是流处理场景。...通过 Beam,开发者可以设计出高效、可移植的数据处理流水线,适应不断变化的业务需求和计算环境。
开发者可以利用这个库来构建更强大的数据流水线,同时享受dbnd提供的自动化优势。 在实际应用中,dbnd-airflow可以帮助数据工程师实现以下功能: 1. **任务跟踪**:dbnd-airflow可以记录每个任务的运行状态,包括...
25. **流水线装配**:指工作对象在装配过程中按顺序由一个工人传递给另一个工人,这种生产组织方式称为流水线作业,答案是“工作对象在装配过程中,有顺序地由一个工人转移到另一个工人”。 这些知识点涵盖了机械...
设计最佳生产线时,不应受现有工作流程的约束,理想情况下,应避免任何阻碍流水线顺畅运行的障碍。在布局时,需遵守OSHA等相关安全规定,同时考虑到环境和安全性因素。在成本允许的情况下,可以考虑移动任何阻碍精益...
例如,你可以使用它来创建一个自动化的数据流水线,该流水线从多个数据源提取数据,清洗、转换数据,然后训练机器学习模型。dbnd-airflow会自动记录每个步骤的运行情况,包括日志、指标和结果,以便于后期的分析和...