Sunday, August 8, 2021

How to use ARM- Automatic resource management in Java - Try with Resource Example

ARM automatic resource management is  another attractive features of Java 7 and project coin. As name itself implies that now JVM is going to be handling all the external resources and make programmers free to bother about resource management.  If my java programmers use any external resources like file, printer or any devices to close after my program execution complete. Normally we close the resources which we have open in beginning of our program or we decide that if program finish normally how to manage the resource or if our program finish abnormally how to close the resource.


ARM- Automatic resource management in Java

automatic resource management (ARM) in java jdk7Earlier these things or resource management is achieved by try {} catch {} finally block we need to declare resource variable outside of try block and in the catch or finally we use these variables for achieving normal execution of a program. 

This JDK7 tutorial is in continuation of my earlier tutorial How to code with the multi-cache exception in JDK7 and How to use String in Switch case on JDK7

Example of resource management in java before JDK7

Here is an example of how we used to do handle resource management before the automatic resource management (ARM) feature was made available.



FileInputStream stockQuoteReader= null;
      FileOutputStream stockQuoteWriter = null;
      try {

        stockQuoteReader = new FileInputStream("StockQuotes.txt");
        stockQuoteWriter = new FileOutputStream("StockQuotes.txt");
        int var;
        while (var = stockQuoteReader.read()) != -1)
          stockQuoteWriter.write(var);
      } finally {
        if (stockQuoteReader!= null)
          stockQuoteReader.close();
        if (stockQuoteWriter!= null)
          stockQuoteWriter.close();
      }

But with Java 1.7 we manage this thing very easily by trying with resource block where inside try we manage these external resources.


Signature of Automatic Resource Management (ARM)

Signature is try(resource1;resource2){}after final resource; the semicolon is not allowed and the resource should be like var=expression type and by default all the resources are final type.

What has been added in API for Automatic Resource Management

java.lang.AutoCloseable, interface has been added in API which contains single method close() throws Exception this interface is a parent of java.io.closeable interface so all the input and output devices inherit this property.


Example of Automatic Resource Management (ARM) in JDK7

Here is an example of automatic resource management with JDK 1.7 source base. Please make sure you run this with java source 1.7 otherwise you will get a compilation error.


try (
FileInputStream stockQuoteReader = new FileInputStream("StockQuotes.txt");
FileOutputStream stockQuoteWriter = new FileOutputStream("StockQuotes.txt")
) {
      int var;
      while((var= stockQuoteReader.read()) != -1 )
            stockQuoteWriter.write();
  }


In this code inside try we have declared two file streams one is the input file we are reading from one file and writing to another file. After the whole process, both streams will be closed automatically either the code has been executed normally or not which means stockQuoteReader.close() and stockQuoteWriter.close() called automatically which is the best part of ARM.

If we compare this with an earlier example then if any exception occurs during input file closing i.e. stockQuoteReader.close() , stockQuoteWriter.close() will never get executed so our code is terminated abnormally.


Some important points which need to be kept in mind when using ARM

Whatever resource we are using should be subtypes of AutoCloseable otherwise will get a compile-time error.

The resources which we are using are closed in reverse order means stockQuoteWriter.close() will be called first then stockQuoteReader.close().


That’s all on the new automatic resource management (ARM) feature in Java, somehow it addresses the cluttering of code due to checked exception handling and code duplication on several exception cache block.



Related tutorials in Java

4 comments:

  1. Completely agree automatic resource management java7 is a great feature. by using automatic resource management arm block with try statement we can effectively reduce boiler plate codes.

    ReplyDelete
  2. automatic resource management Java in try statement is a great edition in JDK7. automatic resource management arm blocks jdk 7 is very convenient feature for java developers in only some respect automatic resource management article. What more is that ARM has been there for quite a while in other languages and Java has just adapted it.

    ReplyDelete
  3. I agree with @Anonymous here. Java 1.7 automatic resource management (ARM) improves code readability and stability by automatic closing orphaned resources and removing clutter from code. Only requirement is that resource must implement Closeable interface. Though Java 1.7 has retrofitted many Stream and IO classes to implement Closeable , you need to do this by your own Resources.

    ReplyDelete
  4. I have written an article on try with resource with examples and difference with normal try-catch exceptions scenario that you might want to check.

    www.journaldev.com/592/try-with-resource-example-java-7-feature-for-automatic-resource-management

    ReplyDelete