Khi chúng ta sử dụng các resource như InputStream, OutputStream trong Java, chúng ta nên nhớ close resource đó sau khi sử dụng. Nếu không sẽ gặp lỗi memory leak sau một thời gian chạy chương trình.
Trước Java 7, chúng ta có thể close một resource trong đoạn code finally:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.huongdanjava.lombok; import java.io.*; public class Example { public static void main(String[] args) throws IOException { InputStream is = null; try { is = new FileInputStream(new File("/Users/Khanh/text.txt")); } finally { if (is != null) { is.close(); } } } } |
Từ Java 7 thì chúng ta có thể sử dụng try with resource để tự động close resource như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.lombok; import java.io.*; public class Example { public static void main(String[] args) throws IOException { try (InputStream is = new FileInputStream(new File("/Users/Khanh/text.txt"));) { } } } |
Sử dụng try with resource, Java sẽ tự động gọi phương thức close() của đối tượng resource sau khi sử dụng.
Với Project Lombok, các bạn còn có một cách khác nữa để tự động close resource sau khi sử dụng. Đó chính là sử dụng annotation @Cleanup của Project Lombok:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.lombok; import lombok.Cleanup; import java.io.*; public class Example { public static void main(String[] args) throws IOException { @Cleanup InputStream is = new FileInputStream(new File("/Users/Khanh/text.txt")); } } |
Nếu các bạn kiểm tra tập tin Example.class nằm trong thư mục /target/classes/com/huongdanjava/lombok/, các bạn sẽ thấy nội dung của tập tin này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.huongdanjava.lombok; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collections; public class Example { public Example() { } public static void main(String[] args) throws IOException { InputStream is = new FileInputStream(new File("/Users/Khanh/text.txt")); if(Collections.singletonList(is).get(0) != null) { is.close(); } } } |
Trong trường hợp method close đối tượng resource không phải là close(), các bạn có thể khai báo method này trong annotation @Cleanup như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.lombok; import lombok.Cleanup; import java.io.*; public class Example { public static void main(String[] args) throws IOException { @Cleanup(value = "close") InputStream is = new FileInputStream(new File("/Users/Khanh/text.txt")); } } |