diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java
index 0d6611d6a41cc6ccf572eb2b7e65dd556ba2bce6..40443af75153985ee83cc187711ff0bcb5cbcab4 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractImageReader.java
@@ -57,7 +57,14 @@ public abstract class AbstractImageReader implements IImageReader
 
     public final List<ImageID> getImageIDs(File file) throws IOExceptionUnchecked
     {
-        return getImageIDs(new RandomAccessFileImpl(file, "r"));
+        RandomAccessFileImpl raf = new RandomAccessFileImpl(file, "r");
+        try
+        {
+            return getImageIDs(raf);
+        } finally
+        {
+            raf.close();
+        }
     }
 
     public final List<ImageID> getImageIDs(byte[] bytes)
@@ -73,7 +80,13 @@ public abstract class AbstractImageReader implements IImageReader
     public BufferedImage readImage(File file, ImageID imageID, IReadParams params) throws IOExceptionUnchecked
     {
         IRandomAccessFile raf = new RandomAccessFileImpl(file, "r");
-        return readImage(raf, imageID, params);
+        try
+        {
+            return readImage(raf, imageID, params);
+        } finally
+        {
+            raf.close();
+        }
     }
 
     public BufferedImage readImage(byte[] bytes, ImageID imageID, IReadParams params)
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java
index 9c413a25e18c19ed51407ad0bc158762a03e69cf..e2a90dba58b1ea515e4182594903cb4946c613e6 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/AbstractMetaDataAwareImageReader.java
@@ -41,7 +41,13 @@ public abstract class AbstractMetaDataAwareImageReader extends AbstractImageRead
             throws IOExceptionUnchecked
     {
         IRandomAccessFile raf = new RandomAccessFileImpl(file, "r");
-        return readMetaData(raf, imageID, params);
+        try
+        {
+            return readMetaData(raf, imageID, params);
+        } finally
+        {
+            raf.close();
+        }
     }
 
     @Override
diff --git a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java
index 9d0bd012676ebdcd6cd1a3e77de5cacfa7d35a26..abfc8eec4c90256d15ec78744af4b5cb90cb1d4b 100644
--- a/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java
+++ b/image_readers/source/java/ch/systemsx/cisd/imagereaders/bioformats/BioFormatsImageUtils.java
@@ -61,16 +61,37 @@ final class BioFormatsImageUtils
      */
     public static IFormatReader tryToCreateReaderForFile(String fileName)
     {
-        for (IFormatReader r : READERS)
+        for (IFormatReader reader : READERS)
         {
-            if (r.isThisType(fileName))
+            try
             {
-                return createReader(r.getClass());
+                if (reader.isThisType(fileName))
+                {
+                    return createReader(reader.getClass());
+                }
+
+            } finally
+            {
+                // "r.isThisType(fileName)" line can open a file handle,
+                // so we need to close it
+                closeOpenedFiles(reader);
             }
         }
         return null;
     }
 
+    private static void closeOpenedFiles(IFormatReader r)
+    {
+        try
+        {
+            r.close(true);
+        } catch (IOException ex)
+        {
+            throw new IOExceptionUnchecked(ex);
+        }
+
+    }
+
     /**
      * Tries to create an {@link IFormatReader} for a specified name. This is a factory method which
      * returns for each invocation a new instance of the requested reader. May return