代码之家  ›  专栏  ›  技术社区  ›  user3389199

文件传输后关闭ServerSocket时出错Java

  •  0
  • user3389199  · 技术社区  · 11 年前

    我有下面的代码当我没有closeServerSocket语句时,我收到一个错误,说这是资源泄漏,但当我添加close语句时,Eclipse告诉我代码不可访问,我如何更改代码以关闭while语句之外的套接字?

    serverSocket = new ServerSocket(ServerPort);
        File incomingFile = new File("testfile.txt");
    
        while (true) {
            System.out.println("Waiting For File");
            Socket incomingSocket = serverSocket.accept();
            byte[] mybytearray = new byte[(int) incomingFile.length()];
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(incomingFile));
            bis.read(mybytearray, 0, mybytearray.length);
            bis.close();
            OutputStream os = incomingSocket.getOutputStream();
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            if (incomingSocket != null) {
                incomingSocket.close();
            }
    
        }
        if(serverSocket != null) {
            serverSocket.close();
        }
    
    1 回复  |  直到 11 年前
        1
  •  3
  •   gknicker    11 年前

    防止资源泄漏的正确方法是使用 try..finally

        serverSocket = new ServerSocket(serverPort);
        try {
            File incomingFile = new File("testfile.txt");
            while (true) {
                // your code
            }
        } finally {
            serverSocket.close();
        }
    

    或使用 try-with-resources 像这样构造

        try (serverSocket = new ServerSocket(serverPort)) {
            File incomingFile = new File("testfile.txt");
            while (true) {
                // your code
            }
        }
    

    代码无法访问的原因是 while 回路未终止。还应注意 serverSocket 在代码中的该点不能为null,因为除非引发异常,否则构造函数必须始终生成新实例。