try with resources & AutoCloseable java 7 (example & class hierarchy)

  • The try-with-resources is try statement that used to declare one or more resources.
    • e.g. resources like BufferedReader, Scanner, BufferedWriter can be used with try-with-resource statement.
  • Any resource class implementing AutoCloseable interface, can be used with try-with-resource statement.
    • Resources are closed automatically at the end of try statement.
  • We will look into the resources implementing AutoCloseable interface e.g. BufferedWriter, BufferedReader.
  • We will discuss Class hierarchy of custom BufferedWriter & BufferedReader classed with the help of example program.

Examples of AutoCloseable Interfaces:

1. BufferedReader class Implements AutoCloseable Interface:

  • BufferedReader class implements AutoCloseable.
  • BufferedReader class can be used with try-with-resource statement.
  • We will create our custom BufferedReader class by extending BufferedReader class, to demonstrate close method of AutoCloseable interface.
  • Override close method in CustomBufferedReader class.
    • close method will be called automatically at the end of try statement.
  • Class hierarchy of custom BufferedReader class is as follows:
BufferedReader autocloseable
Fig 1: CustomBufferedReader class hierarchy

Program – CustomBufferedReader class code is as follows:

class CustomBufferedReader extends BufferedReader {

 public CustomBufferedReader(Reader in) {
  super(in);  
 }
 
 @Override
 public void close() throws IOException {  
  super.close();
  System.out.println("AutoCloseable: Closing BufferReader resource");
 }
}

2. BufferedWriter class implements AutoCloseable interface:

  • BufferedWriter class implements AutoCloseable interface (similar to BufferedReader class)
    • BufferedWriter class can be used with try-with-resource statement.
  • Create CustomBufferWriter class by extending BufferedWriter class.
  • Override close method in CustomBufferedWriter class.
  • Class hierarchy of custom bufferedWriter class is as follows:
BufferedWriter try with resource
Fig 2: CustomBufferedWriter class hierarchy

Program – CustomBufferedWriter class code is as follows:

class CustomBufferedWriter extends BufferedWriter{

 public CustomBufferedWriter(Writer out) {
  super(out);  
 }
 
 @Override
 public void close() throws IOException {  
  super.close();
  System.out.println("AutoCloseable: Closing CustomBufferedWriter resource");
 }
}

AutoCloseable interface:

  • Resources implementing AutoCloseable interface will be closed automatically (on exiting the try statement).
  • Custom BufferedReader & BufferedWriter class implements AutoCloseable interface.
  • Let us look into the complete code to demonstrate AutoCloseable interface.
    • close method of CustomBufferedReader & CustomBufferedWriter class will be called automatically.

Program of Custom BufferedReader & BufferedWriter Classes

package org.learn.try_with_resource;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class DemoTryWithResource
{
    public static void main( String[] args ) throws IOException
    {
     writeUsingBufferWriter();
  readUsingBufferReader(); 
    }

    private static void writeUsingBufferWriter() throws IOException {
  System.out.println("1. Start writing contents to file - CustomBufferedWriter");  
  try (FileOutputStream fileStream = new FileOutputStream(new File("sampleFile.txt"));
    OutputStreamWriter writer = new OutputStreamWriter(fileStream);
    CustomBufferedWriter customBufferWriter = new CustomBufferedWriter(writer)) {
   customBufferWriter.write("Soccer");
   customBufferWriter.newLine();
   customBufferWriter.write("Tennis");   
  }
  System.out.println("3. Successfully written contents to file - CustomBufferedWriter");
 }
 
 private static void readUsingBufferReader() throws IOException {
  System.out.println("\n4. Start Reading file using CustomBufferedReader");
  try (FileInputStream fileStream = new FileInputStream(new File("sampleFile.txt"));
    InputStreamReader reader = new InputStreamReader(fileStream);
    CustomBufferedReader customBufferedReader = new CustomBufferedReader(reader)) {
   String line;
   while ((line = customBufferedReader.readLine()) != null) {
    System.out.println(line);
   }
  }
  System.out.println("6. End Reading file using CustomBufferedReader");
 }
}

class CustomBufferedWriter extends BufferedWriter{

 public CustomBufferedWriter(Writer out) {
  super(out);  
 }
 
 @Override
 public void close() throws IOException {  
  super.close();
  System.out.println("2. AutoCloseable: Closing CustomBufferedWriter resource");
 }
}

class CustomBufferedReader extends BufferedReader {

 public CustomBufferedReader(Reader in) {
  super(in);  
 }
 
 @Override
 public void close() throws IOException {  
  super.close();
  System.out.println("5. AutoCloseable: Closing CustomBufferedReader resource");
 }
}

Output of AutoCloseable & try-with-resource is as follows:

1. Start writing contents to file - CustomBufferedWriter
2. AutoCloseable: Closing CustomBufferedWriter resource
3. Successfully written contents to file - CustomBufferedWriter

4. Start Reading file using CustomBufferedReader
Soccer
Tennis
5. AutoCloseable: Closing CustomBufferedReader resource
6. End Reading file using CustomBufferedReader
Scroll to Top