Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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_Sockets_Casting_Streaming - Fatal编程技术网

Java 正在使用ObjectInputStream等待来自套接字的数据

Java 正在使用ObjectInputStream等待来自套接字的数据,java,sockets,casting,streaming,Java,Sockets,Casting,Streaming,我正在以一种奇怪的方式等待流中的数据。。。因为我认为每次流尝试readObject()时抛出异常不是一个好主意。这就是为什么我使用PushBackInputStream,并且每10毫秒从该流中读取一个字节 @Override public void run() { try { ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream( clientSocket.getOutputStr

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

@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()) {
        ...
在代码的该部分:

ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
ArrayList arrList=(ArrayList)ois.readObject();
我做错了什么?是否有更好的解决方案来等待数据

更新:

ArrayList<Object> arrList = null;
    for (;;) {
        try {
        arrList = ((ArrayList<Object>) ois.readObject());
        break;
        } catch (Exception e) {

        }
    }
    int command = (Integer) arrList.get(0);
ArrayList arrList=null;
对于(;;){
试一试{
arrList=((ArrayList)ois.readObject());
打破
}捕获(例外e){
}
}
int命令=(整数)arrList.get(0);

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

一旦流关闭,它就不会重新打开,因此读取字符以检查流是否已完成并丢弃它不是很有用。在操作将阻塞时休眠也不是很有用


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

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

一旦流关闭,它就不会重新打开,因此读取字符以检查流是否已完成并丢弃它不是很有用。在操作将阻塞时休眠也不是很有用


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

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

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

你不必以任何方式或形式自己做任何事情。只需调用
readObject()


永远不要忽略一个异常,没有必要偷看和睡觉。这完全是在浪费你的时间和精力以及CPU的时间和空间

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

你不必以任何方式或形式自己做任何事情。只需调用
readObject()


永远不要忽略一个
IOException

是的。双流包装是一个错误,现在我用这种方式修复了我的代码(如上所述)。。。这是可行的,但我想这对于真正的数据处理来说太慢了……可能太慢了,但可能已经足够快了。这取决于你的要求。双流包装是一个错误,现在我用这种方式修复了我的代码(如上所述)。。。这是可行的,但我想这对于真正的数据处理来说太慢了……可能太慢了,但可能已经足够快了。这取决于您的要求。您的意思是我的流将等待新数据吗?如果流中没有数据,
readObject()
会抛出异常吗?@Pavel我不仅是认真的,我说了。Javadoc也是如此。它将阻塞,直到数据到达。就叫它吧。当对等方关闭连接时,它将抛出
EOFEException
。很简单。谢谢,@EJP!我不知道我怎么会错过那个!你的意思是我的流将等待新数据吗?如果流中没有数据,
readObject()
会抛出异常吗?@Pavel我不仅是认真的,我说了。Javadoc也是如此。它将阻塞,直到数据到达。就叫它吧。当对等方关闭连接时,它将抛出
EOFEException
。很简单。谢谢,@EJP!我不知道我怎么会错过那个!
ArrayList<Object> arrList = null;
    for (;;) {
        try {
        arrList = ((ArrayList<Object>) ois.readObject());
        break;
        } catch (Exception e) {

        }
    }
    int command = (Integer) arrList.get(0);