Java - 用 InputStream 装饰 PipedInputRead 从未完成?

Java - Decorate PipedInputRead with InputStream never accomplished?

我正在使用 PipedInputStream 和 PipedOutputStream 构建一个形状处理系统。为了能够处理对象,我用 ObjectStream 装饰管道。问题是,当我尝试在输入管道上添加 ObjectInputStream 时,此步骤从未完成。应用程序永远等待某事发生。换句话说,当我尝试调试应用程序时,断点永远不会超过 ObjectInputStream 的实例化。

该应用程序是使用 gradle 构建的。 Eclipse 仅用作远程调试工具。如果你有任何线索,请告诉我(:

谢谢

SplitShapesFilter.java

// [...]
private ObjectInputStream shapeInputStream;
private ObjectOutputStream convexOutputStream;

public SplitShapesFilter(InputStream shapeInput, OutputStream convexOutput) {
    try {
        this.convexOutputStream = new ObjectOutputStream(new BufferedOutputStream(convexOutput));
        this.shapeInputStream = new ObjectInputStream(new BufferedInputStream(shapeInput)); // block at this line
    } catch(Exception e) {
        System.out.println(e.getMessage());
    }
}
// [...]

Orchestrator.java

// [...]
public void startPipes() {
    float[] data = {/*some datas*/};
    final PipedOutputStream shapeOutput = new PipedOutputStream();
    PipedInputStream shapeInput = new PipedInputStream();
    shapeOutput.connect(shapeInput);

    final PipedOutputStream convexOutput new PipedOutputStream();

    Thread findShapesFilter = new FindShapesFilter(data, shapeOutput);
    Thread splitShapesFilter = new SplitShapesFilter(shapeInput, convexOutput);    

    // [...]

    findShapesFilter.start();
    splitShapesFilter.start();

    // an other thread will join the others lather
}

这是因为 ObjectInputStream 的构造函数本身将读取流 header。虽然可能出乎意料,但 JavaDoc does say so.

由于您尚未启动您的线程,因此它会一直阻塞是很自然的 header 而不是永远不会到达。

然后,您需要做的是仅在构造函数中保存支持 InputStream,并且仅在新线程的上下文中构造 ObjectInputStream