首页 > 解决方案 > 如何使用多个管道流

问题描述

这是韩国人第一次在这里写作。如果有一些或很多语法错误,请理解谢谢。

我正在尝试制作管道输入流。它是关于读取两个 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();
        }
    }
}

标签: javafilterpipe

解决方案


推荐阅读