gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:46:37 25 4
gpt4 key购买 nike

我正在使用 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

关于Java - 用 InputStream 装饰 PipedInputRead 从未完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29090892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com