2014-04-01 36 views
2

我接管其包含以下代码的现有Java项目:我应该在ObjectOutputSream的close()之前调用reset()吗?

class ConnectionHandler extends Thread { 
    private Socket socket; 

    public ConnectionHandler(Socket s) { 
     this.socket = s; 
    } 

    private void doSthForRequest(ObjectInputStream in, ObjectOutputStream out) throws Exception { 
     // Do something and write output to out: 
     // out.writeObject(someOutput); 
    } 

    public void run() { 

     ObjectOutputStream out = null; 
     ObjectInputStream in = null; 

     try { 
      in = new ObjectInputStream(socket.getInputStream()); 
      out = new ObjectOutputStream(socket.getOutputStream()); 
      while (true) { 
       out.reset(); 
       doSthForRequest(in, out); 
      } 
     } catch (Exception ex) { 
      if (out != null && !socket.isOutputShutdown()) { 
       try { 
        out.writeObject(ex); 
        out.flush(); 
       } catch (Exception ex2) {} 
      } 
     } finally { 
      if (out != null) { 
       try { 
        out.reset(); // any reason for this? 
       } catch (Exception ee) {} 
      } 
      if (out != null) { 
       try { 
        out.close(); 
       } catch (Exception ee) {} 
      } 
      try { 
       socket.close(); 
      } catch (Exception e) {} 
     } 

     socket = null; 
    } 
} 

有这一个插座上的服务请求,并产生输出ConnectionHandler线程。而我的问题是:

如果在它之后立即有close()调用,reset()调用仍然有意义吗?

原作者刚刚离开一个行注释// clear outputstream cache这让我困惑...

感谢您的帮助!

+0

我认为这个代码中可能还有更多问题,请更正我的问题!非常感谢! –

回答

2

No. reset()通过线路发送标签,告诉对方清除其句柄表。由于您即将关闭流,重置操作没有意义,并且出现错误是额外的网络操作。关闭它。

至于其他问题:

  1. 构建ObjectOutputStream之前发生的ObjectInputStream.否则死锁。

  2. 在此处使用try-with-resources语法。它将大大简化代码。

相关问题