Try-with resources in Java (Part 5)

 Pre-requisites: Exception Handling , File Reading by Other ways

Try-with Resources


  • Try-with resources automatically closes the resources which are defined in it.
  • We don't have to explicitly write the code to close those resources as it implements an interface called as AutoCloseable .
  • This interface already has an abstract method called void close( ) which closes required resources. 
Syntax:-
  try (resource defined) {  
     //block of code  
  } catch (exception 1) {  
     //user exception prompt  
  }  

Advantages of try-with resources 

1. finally block not required to close the resource

Let us compare a program by first using try-catch statements and then using same program with try-with resources.

Using try-catch statement :
 import java.io.BufferedReader;  
 import java.io.File;  
 import java.io.FileNotFoundException;  
 import java.io.FileReader;  
 import java.io.IOException;  
   
 public class MyClass {  
   public static void main(String[] args) {  
     File file = new File("C:\\Users\\Desktop\\example.txt");  
     BufferedReader br = null;  
     int line;  
     try {  
       System.out.println("Entering try block");  
       FileReader fr = new FileReader(file);  
       br = new BufferedReader(fr);  
       while ((line = br.read()) != -1) {  
         System.out.print((char) line);   
       }  
     } catch (FileNotFoundException e) {  
       System.out.println("File Not Found: " + file.toString());  
     } catch (IOException e) {  
       System.out.println("Unable to perform I/O operations on file: "+ file.toString());  
     } finally {  
       System.out.println("Entering finally block");  
       try {  
         br.close();  
         System.out.println("Successfully closed BufferedReader: "+ br.toString());  
       } catch (IOException e) {  
         System.out.println("Unable to close BufferedReader: "+ br.toString());  
       }  
     }  
   }  
 }  
Output:- ( If file is found )
 Entering try block  
 Hello I am a Text File.  
 This is my 2nd line.  
 This is my 3rd line.  
 Thank You.  
 Entering finally block  
 Successfully closed BufferedReader: java.io.BufferedReader@1f6f0bf  

Here we had to add an extra try-catch block to close BufferedReader as it is suspicious of throwing IOException.

Now let us see the same program using try-with resources. 
 import java.io.BufferedReader;  
 import java.io.File;  
 import java.io.FileNotFoundException;  
 import java.io.FileReader;  
 import java.io.IOException;  
   
 public class MyClass {  
   public static void main(String[] args) {  
     File file = new File("C:\\Users\\Desktop\\example.txt");  
     int line;  
       
     //here try-with resource is used   
     try (BufferedReader br=new BufferedReader(new FileReader(file))) {   //resource used
       
       System.out.println("Entering try block");  
       while ((line = br.read()) != -1) {  
         System.out.print((char) line);   
       }  
     } catch (FileNotFoundException e) {  
       System.out.println("File Not Found: " + file.toString());  
     } catch (IOException e) {  
       System.out.println("Unable to perform I/O operations on file: "+ file.toString());  
     }   
   }  
 }  
Output:- ( If file is found )
 Entering try block  
 Hello I am a Text File.  
 This is my 2nd line.  
 This is my 3rd line.  
 Thank You.  
While using try-with resources , the work of finally block is done by the resource itself as it implements the Autoclosable( ) interface.

Here I have written bufferedReader in another format. If we separate the lines it would be read as:
   File file = new File("C:\\Users\\Desktop\\example.txt");  
   int line;  
   FileReader fr=new FileReader(file);  
   BufferedReader br=new BufferedReader(fr);  


2. Can use multiple resources at a time

Syntax:-
 try((resource 1);  
   (resource 2);  
   (resource 3)) {  
     // code to be executed  
     } 
Here we can use many resources at once by separating them by a semi-colon. These resources are closed in the reverse order by the Autoclose( ) interface.

For example here , Let's see an example of reading a file by using scanner and a BufferedReader so that it forms an example of above mentioned type;  
 import java.io.BufferedReader;  
 import java.io.File;  
 import java.io.FileNotFoundException;  
 import java.io.FileReader;  
 import java.io.IOException;  
 import java.util.Scanner;  
   
   
 public class MyClass {  
   public static void main(String[] args) {  
     File file = new File("C:\\Users\\bharg\\Desktop\\example.txt");  
     int line;  
       
     //using try multi resource  
     try (BufferedReader br = new BufferedReader(new FileReader(file));  
         Scanner scan = new Scanner(file)) {  
       System.out.println("Reading by BufferedReader");  
       while ((line = br.read()) != -1) {  
         System.out.print((char) line);  
       }  
       System.out.println("Reading by Scanner");  
       while (scan.hasNext()) {  
         System.out.println(scan.nextLine());  
       }  
     } catch (FileNotFoundException e) {  
       System.out.println("Unable to find file: " + file.toString());  
     } catch (IOException e) {  
       System.out.println("Unable to perform I/O operations on file: "+ file.toString());  
     } catch (Exception e) {  
       System.out.println("Some other error occured.");  
     }  
   }  
 }  
Output:-
 Reading by BufferedReader  
 Hello I am a Text File.  
 This is my 2nd line.  
 This is my 3rd line.  
 Thank You.  
   
 Reading by Scanner  
 Hello I am a Text File.  
 This is my 2nd line.  
 This is my 3rd line.  
 Thank You.  


In Java 7 when try-with resources was introduced , to use the resource the resource must be defined in the block of try. So to improve this , Java 9 approved the definition of resources locally and can be used in the try-with resources block by just mentioning its variable name.

Before Java 9:-
 File file=new File("C:\\Users\\Desktop\\example.txt");  
     try (Scanner scan=new Scanner(file)) {  
       //code to be executed  
     }  


After Java 9:-
 File file=new File("C:\\Users\\Desktop\\example.txt");  
     Scanner scan=new Scanner(file)  
     try (scan) {  
       //code to be executed  
     }  


< Previous Next >