【问题标题】:How to check ObjectInputStream is empty in Java?如何在 Java 中检查 ObjectInputStream 是否为空?
【发布时间】:2021-03-23 22:54:57
【问题描述】:

我试图通过套接字实现一个基本的聊天应用程序,但我遇到了 ObjectInputStream 的问题。我在 while(true) 循环中使用了两种写读方法,当没有任何东西可以读取并无限等待它时,编译过程卡住了。因此,我需要在阅读之前检查它是否为空。

这是我的代码。

服务器:

Socket socket = server.accept();
        
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        
        oos.writeObject("Server connected!");
        oos.flush();
        
        String message = (String) ois.readObject();
        System.out.println(ois.available());
        txtChat.setText(message);
        
        while(true) {
            
            if(sendMessage) {
                
                oos.writeObject(txtMessage.getText());
                oos.flush();

                sendMessage = false;
            }
            
            while(!sendMessage) {
                message = (String) ois.readObject();
                txtChat.setText(txtChat.getText()+"\n"+"Client: "+message);
            }

            Thread.sleep(100);
        }

客户:

socket = new Socket(host.getHostName(), 9876);
        oos = new ObjectOutputStream(socket.getOutputStream());
        ois = new ObjectInputStream(socket.getInputStream());
        
        oos.flush();
    
        String message = (String) ois.readObject();
        txtChat.setText(message);
        
        while(true) {
            message = (String) ois.readObject();
            txtChat.setText(txtChat.getText()+"\n"+"Server: "+message);
            
            if(sendMessage) {
                oos.writeObject(txtMessage.getText());
                oos.flush();
                
                sendMessage = false;
            }
            
            
            Thread.sleep(100);
        }
    

【问题讨论】:

  • 不确定所有上下文,但您总是可以:ois.readObject().toString().isEmpty()
  • 您可能需要检查available() 是否对您有用。
  • 由于没有要读取的对象,它等待检查 ois.ReadObject().toString().isEmpty()。我无法确定是否存在字符串,因为 available() 返回字节的整数值。几乎所有情况下它都返回 0。
  • @tugraturkseven 如果确实有可以读取的对象,available()的返回值会大于0吗?
  • @Progman 因为它基于字符串,不幸的是没有。

标签: java objectinputstream


【解决方案1】:

流要么关闭要么打开。

输入流不知道它已关闭,直到您从中读取内容。这正是为什么流上不存在这样的isClosed() 方法的原因。

您可以将流中的字节读取到对象中。充其量您将能够构建对象。否则,您应该处理 IO 异常并做出相应决定。

您可以选择检查在不阻塞的情况下可以读取多少字节。如果为 0,则您正在查看等待输入的空流。

inputStream.available() != 0 //handle exception

【讨论】:

  • 感谢您的回答,但不幸的是因为它基于字符串 avilable() 方法大多返回 0。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多