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