2012-09-17 31 views
0

我在流中等待数据这样一种奇怪的方式......因为我认为每次尝试流都会抛出异常readObject()不是一个好主意。这就是为什么我使用PushBackInputStream并且每10毫秒从该流读取一个byte使用ObjectInputStream等待来自套接字的数据

@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()) { 
     ... 

我做了什么错流......我得到一个异常:

Exception in thread "Thread-0" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to java.util.ArrayList 
at com.rizhov.main.ClientHandler.run(ClientHandler.java:39) 

在代码的一部分:

ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject(); 

我在做什么错?有没有更好的解决方案来等待数据。

UPDATE:

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

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

回答

1

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

流关闭后,它不会重新打开,因此读取字符以检查流是否已完成并丢弃它并不是非常有用。无论如何,手术会阻止睡觉也不是很有用。

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

+0

是的。双流包装是一个错误,现在我以这种方式修正了我的代码(这在上面)......但是我认为这对于真正的数据处理来说太慢了...... –

+0

它可能太慢了,但它可能超过了足够快。这取决于你的要求。 –

2

有没有需要任何这个偷看和睡觉。这完全浪费了你的时间和精力以及CPU时间和空间。

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

你不必以任何方式做任何形状或形式的任何。请致电readObject()

永远不要忽视IOException

+0

你的意思是我的流将等待新的数据?如果该流中没有数据,'readObject()'会抛出任何异常吗? –

+1

@Pavel我不仅仅是这个意思,我说过。 Javadoc也是如此。它会阻止,直到数据到达。只需调用它。它会在对端关闭连接时抛出'EOFException'。这很容易。 – EJP

+0

谢谢,@EJP!我不知道我是如何错过的! –

相关问题