如何在 Java 中检查 ObjectInputStream 是不是为空?

Posted

技术标签:

【中文标题】如何在 Java 中检查 ObjectInputStream 是不是为空?【英文标题】: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 因为它基于字符串,不幸的是没有。 【参考方案1】:

流要么关闭要么打开。

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

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

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

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

【讨论】:

感谢您的回答,但不幸的是因为它基于字符串 avilable() 方法大多返回 0。

以上是关于如何在 Java 中检查 ObjectInputStream 是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中识别已检查和未检查的异常?

Java中静态类型检查是如何进行的

如何在 Java 中检查有效的 URL?

java - 如何检查是不是在java中的不同类中单击了按钮?

java - 如何在java swing中检查当前窗口大小?

如何在 Java 中检查 ObjectInputStream 是不是为空?