有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用ObjectInputStream从socket等待java数据

我正在以一种奇怪的方式等待流中的数据。。。因为我认为每次流尝试readObject()时抛出异常不是一个好主意。这就是为什么我使用PushBackInputStream并且每10毫秒从该流中读取一个byte

@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);

共 (2) 个答案

  1. # 1 楼答案

    一条小溪只能绕一次。如果你多次包装它,你很可能会感到困惑,而不是有用

    一旦一个流关闭,它就不会重新打开,所以读取一个字符来检查流是否已经完成并丢弃它不是很有用。不管怎么说,当操作会阻塞时睡觉也不是很有用

    我不使用Integer代码,而是使用枚举值。这将更干净,您将能够使用switch语句

  2. # 2 楼答案

    没有必要偷看和睡觉。这完全是在浪费你的时间和精力以及CPU的时间和空间

    当没有数据时,所有Java流都会阻塞。它们的阻塞时间也完全正确,而不是一次阻塞10毫秒或任何时间,而且不会像你正在做的那样浪费CPU周期

    你不必以任何方式或形式自己做任何事情。打电话给readObject()

    永远不要忽视一个IOException