gpt4 book ai didi

java - 如何修复 ObjectInputStream 和 ObjectOutputStream 的 "write end dead"和 "read end dead"错误?

转载 作者:行者123 更新时间:2023-11-29 04:31:31 33 4
gpt4 key购买 nike

这是 my question here 的一种扩展.

我有 3 个类(class)。

我的主要内容:

import java.io.*;

public class ConnectionManager {
public static void main(String argv[]) {

try {
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(pout);

Sender s = new Sender(pout,true);
Receiver r = new Receiver(pin,true);
System.out.println("Starting threads");
s.start();
r.start();
} catch (Exception e) {System.out.println(e);}
}
}

我的发送者/生产者类:

import java.io.*;

public class Sender extends Thread {
ObjectOutputStream oos;
boolean primitive;

public Sender(OutputStream os, boolean primitive) {
try {
oos = new ObjectOutputStream(os);
this.primitive = primitive;
} catch (Exception e) {System.out.println(e);}
}

public void run() {
try {
System.out.println("Sending a message");
Thread.sleep(1000);
oos.writeInt(99);
oos.flush();
System.out.println("Message sent, terminating");
oos.close();
} catch (Exception e) {System.out.println("Sender: " + e);}
}
}

我的接收者/消费者类:

import java.io.*;

public class Receiver extends Thread {
ObjectInputStream ois;
boolean primitive;

public Receiver(InputStream is, boolean primitive) {
try {
ois = new ObjectInputStream(is);
this.primitive = primitive;
} catch (Exception e) {System.out.println(e);}
}

public void run() {
try {
System.out.println("waiting for a message");
int x = ois.readInt();
System.out.println("message received: " + x);
ois.close();
} catch (Exception e) {System.out.println("Receiver: " + e);}

}
}

产生这个输出:

Starting threads
Sending a message
waiting for a message
Receiver: java.io.IOException: Write end dead
Sender: java.io.IOException: Read end dead

我读入了this page我得到这些异常是因为我没有关闭管道。但即使我这样做了,我仍然得到它们。我该如何解决这个问题?

编辑:我将流对象的类型从 PipedInputStream 转换为 InputStream 然后使用 InputStream 构造一个新的 ObjectInputStream 的原因是因为我希望能够发送和接收各种类型的数据,而不仅仅是int 或 bytes。

最佳答案

这些错误不是来自对象流。查看堆栈跟踪。它们来自管道流,它们的发生是因为相关线程已经退出或尚未启动。而这样做的原因又是因为你在线程构造函数中构造对象流而不是在 run() 方法中,并且两个对象流构造函数都执行 I/O,而你没有尚未启动线程。

你不需要 sleep 。

不要为此使用管道。使用队列。

注意你的评论,你不需要将 PipedInputStream 转换为 InputStream。已经是了。事实上你不是。

关于java - 如何修复 ObjectInputStream 和 ObjectOutputStream 的 "write end dead"和 "read end dead"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43640846/

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