Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中检查ObjectInputStream是否为空?_Java_Objectinputstream - Fatal编程技术网

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

如何在Java中检查ObjectInputStream是否为空?,java,objectinputstream,Java,Objectinputstream,我正试图通过套接字实现一个基本的聊天应用程序,但ObjectInputStream有问题。我在while(true)循环中同时使用write-read方法,而编译过程在并没有什么可读取的内容并无限期地等待时陷入了困境。因此,在阅读之前,我需要检查它是否为空 这是我的密码 服务器: Socket socket = server.accept(); ObjectInputStream ois = new ObjectInputStream(socket.getInp

我正试图通过套接字实现一个基本的聊天应用程序,但ObjectInputStream有问题。我在while(true)循环中同时使用write-read方法,而编译过程在并没有什么可读取的内容并无限期地等待时陷入了困境。因此,在阅读之前,我需要检查它是否为空

这是我的密码

服务器:

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

该流要么关闭,要么打开

在您从输入流中读取某些内容之前,输入流不会意识到它已关闭。这就是为什么流上不存在这样的
isClosed()
方法的原因

您可以将数据流中的字节读入对象。充其量只能构造对象。否则,您应该处理IO异常并做出相应的决定

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

inputStream.available()!=0//句柄异常

流要么关闭,要么打开

在您从输入流中读取某些内容之前,输入流不会意识到它已关闭。这就是为什么流上不存在这样的
isClosed()
方法的原因

您可以将数据流中的字节读入对象。充其量只能构造对象。否则,您应该处理IO异常并做出相应的决定

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

inputStream.available()!=0//句柄异常

不确定所有上下文,但您始终可以:ois.readObject().toString().isEmpty()。您可能需要检查
可用()
是否对您可用。由于没有要读取的对象,因此它仍会等待检查ois.readObject().toString().isEmpty()。我无法决定是否有字符串,因为available()返回字节的整数值。几乎每种情况下,它都返回0。@tugraturk甚至当实际上存在一个可以读取的对象时,
available()
的返回值会大于0吗?@Progman因为它是基于字符串的,不幸的是否。不确定所有的上下文,但您总是可以:ois.readObject().toString().isEmpty()您可能需要检查
available()
如果它对您可用。由于没有要读取的对象,它仍然会等待检查ois.ReadObject().toString().isEmpty()。我无法决定是否有字符串,因为available()返回字节的整数值。几乎每种情况下它都返回0。@tugraturk甚至当事实上存在一个可以读取的对象时,
available()
的返回值会大于0吗?@Progman因为它基于字符串,不幸的是不会。谢谢你的回答,但不幸的是,因为它基于字符串aviable()方法大部分返回0。谢谢你的回答,但不幸的是,由于它基于字符串,aviable()方法大多返回0。