如何在 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中的不同类中单击了按钮?