java - 如何使用多个管道流
问题描述
这是韩国人第一次在这里写作。如果有一些或很多语法错误,请理解谢谢。
我正在尝试制作管道输入流。它是关于读取两个 txt 文件并过滤该文件的数据。
在 LifeCycleManager 中,读取学生、课程文件并写入 output1,2 文件。我的教授说我可以用 arraylist 来读取多个文件,但我迷失了如何做到这一点。
package Framework;
import Components.Middle.MiddleFilter;
import Components.Sink.SinkFilter;
import Components.Source.SourceFilter;
public class LifeCycleManager {
public static void main(String[] args) {
try {
CommonFilter srcFilterS = new SourceFilter("Students.txt");
CommonFilter srcFilterC = new SourceFilter("Courses.txt");
CommonFilter sinkFilter1 = new SinkFilter("Output1.txt");
CommonFilter sinkFilter2 = new SinkFilter("Output2.txt");
CommonFilter middleFilter = new MiddleFilter();
srcFilterS.connectOutputTo(middleFilter);
srcFilterC.connectOutputTo(middleFilter);
middleFilter.connectOutputTo(sinkFilter1);
middleFilter.connectOutputTo(sinkFilter2);
Thread thread1 = new Thread(srcFilterS);
Thread thread2 = new Thread(srcFilterC);
Thread thread3 = new Thread(middleFilter);
Thread thread4 = new Thread(sinkFilter2);
Thread thread5 = new Thread(sinkFilter1);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package Framework;
import java.io.EOFException;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.ArrayList;
public abstract class CommonFilterImpl implements CommonFilter {
protected ArrayList<PipedInputStream> in = new ArrayList<PipedInputStream>();
protected ArrayList<PipedOutputStream> out = new ArrayList<PipedOutputStream>();
public void connectOutputTo(CommonFilter nextFilter, int portNo) throws IOException {
out.get(portNo).connect(nextFilter.getPipedInputStream());
}
public void connectInputTo(CommonFilter previousFilter, int portNo) throws IOException {
in.get(portNo).connect(previousFilter.getPipedOutputStream());
}
public PipedInputStream getPipedInputStream(int portNo) {
return in.get(portNo);
}
public PipedOutputStream getPipedOutputStream(int portNo) {
return out.get(portNo);
}
abstract public boolean specificComputationForFilter() throws IOException;
public void run() {
try {
specificComputationForFilter();
} catch (IOException e) {
if (e instanceof EOFException) return;
else System.out.println(e);
} finally {
closePorts();
}
}
private void closePorts() {
try {
out.get(0).close();
in.get(0).close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
解决方案
推荐阅读
- docker - Sentry On-Premise 无法创建超级用户
- sql - 如何计算分组的总和值
- tensorflow - 为什么 MobileNetV2 仅在移动设备上比 MobileNetV1 快?
- html - 如何在中间使用全尺寸搜索表单制作 bootstrap 3 响应式导航栏?
- vue.js - Twilio TaskRouter JS SDK 不工作
- java - 使用模板的 OrientDB 的 Spring-Data
- android - 如何在双卡上使用 PhoneStateListener 收听?
- iis - 限制特定域的 IIS 重写映射
- c# - 枚举属性、Web API、JSON 反序列化和拼写错误
- php - 如何在 CakePHP 中生成序列号并在编辑后添加带有子序列号的新记录?