JDK1.7新功能中,一个很好用的功能就是自动资源管理功能try-with-resources。
try-with-resources 是一个定义了一个或多个资源的try 声明,这个资源是指程序处理完它之后需要关闭它的对象。try-with-resources 确保每一个资源在处理完成后都会被关闭。 任何实现了java.lang.AutoCloseable 接口和java.io.Closeable 接口的对象,都可以使用try-with-resources。
Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,ServerSocket,Sql classes等,这些类都是实现了Closeable 或者AutoCloseable 接口的。这个新的语言特性允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。JDK1.7中还有很多实现了Closeable接口的类,这些都是需要手动关闭的资源。使用try()将对这些资源类型的定义放在try()的括号中,那么在代码运行结束后就会自动被JVM关闭的。
Socket开发中简单的实例如下:
try (ServerSocket serverSocket = new ServerSocket(8189)) { Socket socket = serverSocket.accept(); } finally { System.out.println("the server is closed !"); }
此外,需要注意的是对资源的关闭,必须在其他线程使用资源完成后再进行,否则就会出现异常。例如Socket开发时,Socket处理操作和关闭操作不是在同一个线程中,那么就会出现Socket关闭异常。一个错误的实例代码如下:
try (Socket socket = new Socket("127.0.0.1", 8189)){ new Thread(new Runnable() // print server's info { @Override public void run() { try { Scanner scanner = new Scanner(socket.getInputStream()); while (true) { if (scanner.hasNext()) { String line = scanner.nextLine(); System.out.println("from client: " + line); if (line.equals("bye")) { break; } } } } catch (IOException e) { e.printStackTrace(); } } }).start(); } finally { System.out.println("the client is closed !"); }上述实例中main线程中使用自动资源管理自动关闭Socket,然后再另一个线程中开启的发送线程仍然在使用该Socket,此时就会遭遇Socket已关闭异常了。总的来说,这个功能还是很好用的,简化了程序开发,而且还能避免大意造成资源不关闭的问题。