专修虚拟机
2015-11-21 13:13
采纳率: 18.8%
浏览 2.1k
已采纳

java创建一个输出流赋值为null的作用

public class Server {
//服务端socket
private ServerSocket serverSocket;
//所有客户输出流
private List allOut;
//线程池
private ExecutorService threadPool;
/**
* 构造方法,用于初始化
*
/
public Server() {
try{
serverSocket=new ServerSocket(8088);
allOut=new ArrayList();
threadPool=Executors.newFixedThreadPool(40);
}catch(Exception e){
e.printStackTrace();
}

}
/
*
* 服务端开启方法
*/
public void start(){

    while(true){
        try{
        System.out.println("等待服务端连接!");
        //监听客户端连接
        Socket socket=serverSocket.accept();
        System.out.println("服务端已经连接");

        //启动一个线程来完成针对客户端的操作
        ClientHandler handler=new ClientHandler(socket);
        threadPool.execute(handler);    



    }catch(Exception e){
        e.printStackTrace();
    }

    }

}

/**
 * 将输出流存入共享集合,与下面两个方法互斥 保证同步安全
 * @param out
 */
public synchronized void addOut(PrintWriter out){
    allOut.add(out);
}
/**
 * 将输出流从共享集合删除
 * @param out
 */
public synchronized void removeOut(PrintWriter out){
     allOut.remove(out);
}
/**
 * 将信息转发给所有客户端
 */
public synchronized void sendMessage(String message){
    for(PrintWriter o:allOut){
        o.println(message);
    }
}

public static void main(String[] args) {
    Server server=new Server();
    server.start();
}
/**
 * 线程体,用于处理不同客户端的交互
 * @author Long
 * 
 */

private class ClientHandler implements Runnable{
private Socket socket;
//该线程用于处理客户端
public ClientHandler(Socket socket){
this.socket=socket;
}
@Override
public void run(){
PrintWriter writer=null;
try{
//获取客户端输出流存入共享集合,广播消息
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");
writer=new PrintWriter(osw,true);

        /**
         * 将用户发的信息存入共享集合,需要同步
         */
        addOut(writer);

        InputStream is=socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(is, "utf-8");
        BufferedReader reader=new BufferedReader(isr);

        Scanner sc=new Scanner(System.in);
        String message=null;
        while((message=reader.readLine())!=null){
            sendMessage(message);
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        /**
         * 当客户端断线,要将输出流从共享集合中移除
         * 需要同步
         */
        removeOut(writer);
        if(socket!=null){
            try{
                socket.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }
}

}

}
1. 在线程体中(文中黑线)为什么要先PrintWriter writer=null而不是在try中直接赋值

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • Be_Proud 2015-11-21 13:18
    已采纳

    PrintWriter writer=null在try中直接赋值那么它的生命周期就只是在try语句块中

    点赞 评论
  • Be_Proud 2015-11-21 13:16

    FK ff=null; 小孩还没有出生,可以让任何一个小孩叫这个名字

    FK ff=new FK();小孩出生并且和名字对应了,以后可以用名字来称呼这个小孩了

    点赞 评论
  • Be_Proud 2015-11-21 13:17

    还有一个好处,就是方便关闭流,释放资源

    点赞 评论

相关推荐 更多相似问题