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