我正在以一种奇怪的方式等待流上的数据...因为我认为每次流尝试 readObject()
时抛出异常不是一个好主意。这就是为什么我使用 PushBackInputStream
并每 10 毫秒从该流中读取一个 字节
。
@Override
public void run() {
try {
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(
clientSocket.getOutputStream()));
oos.flush();
ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
PushbackInputStream pis = new PushbackInputStream(clientSocket.getInputStream());
while (true) {
int tempByte = -1;
if ((tempByte = pis.read()) == -1) {
sleep(10);
} else {
pis.unread(tempByte);
ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
int command = (Integer) arrList.get(0);
if (command == CommandDescriptor.ADD_STRING.getCode()) {
String tempStr = (String) arrList.get(1);
boolean result = Server.colleciton.add(tempStr);
if (result) {
oos.writeInt(1);
oos.flush();
} else {
oos.writeInt(0);
oos.flush();
}
} else if (command == CommandDescriptor.REMOVE_STRING.getCode()) {
...
我对流做了一些错误...我遇到了异常:
Exception in thread "Thread-0" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to java.util.ArrayList
at com.rizhov.main.ClientHandler.run(ClientHandler.java:39)
在代码的那部分:
ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
我做错了什么?有没有更好的解决等待数据的方法。
更新:
ArrayList<Object> arrList = null;
for (;;) {
try {
arrList = ((ArrayList<Object>) ois.readObject());
break;
} catch (Exception e) {
}
}
int command = (Integer) arrList.get(0);
最佳答案
没有必要进行这种偷看和 sleep 的行为。这完全是浪费您的时间和精力以及 CPU 时间和空间。
所有 Java 流在没有数据时都会阻塞。它们阻塞的时间也完全正确,一次不是 10 毫秒或其他任何时间,并且不会像您所做的那样在旋转中浪费 CPU 周期。
您不必以任何方式自己做任何事情。只需调用readObject()
即可。
并且永远不要忽略IOException
。
关于java - 使用 ObjectInputStream 等待来自套接字的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458436/