diff --git a/src/main/org/apache/ant/compress/resources/CommonsCompressArchiveResource.java b/src/main/org/apache/ant/compress/resources/CommonsCompressArchiveResource.java
index c71f3f3..41a4b71 100644
--- a/src/main/org/apache/ant/compress/resources/CommonsCompressArchiveResource.java
+++ b/src/main/org/apache/ant/compress/resources/CommonsCompressArchiveResource.java
@@ -185,9 +185,7 @@
      */
     @Override
     protected void fetchEntry() {
-        ArchiveInputStream i = null;
-        try {
-            i = getStream();
+        try (ArchiveInputStream i = getStream()) {
             ArchiveEntry ae = null;
             while ((ae = i.getNextEntry()) != null) {
                 if (ae.getName().equals(getName())) {
@@ -198,10 +196,6 @@
         } catch (IOException e) {
             log(e.getMessage(), Project.MSG_DEBUG);
             throw new BuildException(e);
-        } finally {
-            if (i != null) {
-                FileUtils.close(i);
-            }
         }
         setEntry(null);
     }
diff --git a/src/main/org/apache/ant/compress/resources/SevenZResource.java b/src/main/org/apache/ant/compress/resources/SevenZResource.java
index db491a9..d6410c7 100644
--- a/src/main/org/apache/ant/compress/resources/SevenZResource.java
+++ b/src/main/org/apache/ant/compress/resources/SevenZResource.java
@@ -164,9 +164,7 @@
             return;
         }
 
-        SevenZFile z = null;
-        try {
-            z = new SevenZFile(f);
+        try (SevenZFile z = new SevenZFile(f)) {
             SevenZArchiveEntry ze = z.getNextEntry();
             while (ze != null) {
                 if (ze.getName().equals(getName())) {
@@ -179,14 +177,6 @@
         } catch (IOException e) {
             log(e.getMessage(), Project.MSG_DEBUG);
             throw new BuildException(e);
-        } finally {
-            if (z != null) {
-                try {
-                    z.close();
-                } catch (IOException ex) {
-                    // swallow
-                }
-            }
         }
     }
 
diff --git a/src/main/org/apache/ant/compress/resources/SevenZScanner.java b/src/main/org/apache/ant/compress/resources/SevenZScanner.java
index 1f73f20..3ecdd3f 100644
--- a/src/main/org/apache/ant/compress/resources/SevenZScanner.java
+++ b/src/main/org/apache/ant/compress/resources/SevenZScanner.java
@@ -88,11 +88,8 @@
 
         File srcFile = fp.getFile();
         SevenZArchiveEntry entry = null;
-        SevenZFile zf = null;
 
-        try {
-            try {
-                zf = new SevenZFile(srcFile);
+        try (SevenZFile zf = new SevenZFile(srcFile)) {
                 entry = zf.getNextEntry();
                 while (entry != null) {
                     /* TODO implement canReadEntryData in CC
@@ -120,14 +117,5 @@
             } catch (IOException ex) {
                 throw new BuildException("Problem opening " + srcFile, ex);
             }
-        } finally {
-            if (zf != null) {
-                try {
-                    zf.close();
-                } catch (IOException ex) {
-                    // swallow
-                }
-            }
-        }
     }
 }
diff --git a/src/main/org/apache/ant/compress/resources/ZipResource.java b/src/main/org/apache/ant/compress/resources/ZipResource.java
index e54169a..a8ab509 100644
--- a/src/main/org/apache/ant/compress/resources/ZipResource.java
+++ b/src/main/org/apache/ant/compress/resources/ZipResource.java
@@ -172,15 +172,11 @@
             return;
         }
 
-        ZipFile z = null;
-        try {
-            z = new ZipFile(getZipfile(), getEncoding());
+        try (ZipFile z = new ZipFile(getZipfile(), getEncoding())) {
             setEntry(z.getEntry(getName()));
         } catch (IOException e) {
             log(e.getMessage(), Project.MSG_DEBUG);
             throw new BuildException(e);
-        } finally {
-            ZipFile.closeQuietly(z);
         }
     }
 
diff --git a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
index c5bf808..7dbc44a 100644
--- a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
+++ b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
@@ -543,12 +543,8 @@
                 ArchiveEntry ent = entryBuilder.buildEntry(r);
                 out.putArchiveEntry(ent);
                 if (!r.getResource().isDirectory()) {
-                    InputStream in = null;
-                    try {
-                        in = r.getResource().getInputStream();
+                    try (InputStream in = r.getResource().getInputStream()) {
                         IOUtils.copy(in, out);
-                    } finally {
-                        FILE_UTILS.close(in);
                     }
                 } else {
                     addedDirectories.add(r.getName());
diff --git a/src/main/org/apache/ant/compress/taskdefs/ExpandBase.java b/src/main/org/apache/ant/compress/taskdefs/ExpandBase.java
index 0eef517..d75de09 100644
--- a/src/main/org/apache/ant/compress/taskdefs/ExpandBase.java
+++ b/src/main/org/apache/ant/compress/taskdefs/ExpandBase.java
@@ -134,27 +134,20 @@
                                      getLocation());
         }
 
-        InputStream i = null;
-        try {
-            i = srcR.getInputStream();
+        try (InputStream i = srcR.getInputStream()) {
             expandStream(srcR.getName(), i, dir);
         } catch (IOException ioe) {
             throw new BuildException("Error while expanding " + srcR.getName(),
                                      ioe, getLocation());
-        } finally {
-            FileUtils.close(i);
         }
     }
 
     private void expandStream(String name, InputStream stream, File dir)
         throws IOException {
-        ArchiveInputStream is = null;
-        try {
-            is = factory.getArchiveStream(new BufferedInputStream(stream),
-                                          getEncoding());
+        try (ArchiveInputStream is =
+                 factory.getArchiveStream(new BufferedInputStream(stream),
+                                          getEncoding())) {
             expandArchiveStream(name, is, dir);
-        } finally {
-            FileUtils.close(is);
         }
     }
 
diff --git a/src/main/org/apache/ant/compress/taskdefs/Un7z.java b/src/main/org/apache/ant/compress/taskdefs/Un7z.java
index c6df0a2..8adfb06 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Un7z.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Un7z.java
@@ -67,21 +67,17 @@
                 }
                 */
                 log("extracting " + ze.getName(), Project.MSG_DEBUG);
-                InputStream is = null;
-                try {
-                    extractFile(fileUtils, srcF, dir,
-                                is = new InputStream() {
-                                        public int read() throws IOException {
-                                            return zf.read();
-                                        }
-                                        public int read(byte[] b) throws IOException {
-                                            return zf.read(b);
-                                        }
-                                    },
+                try (InputStream is = new InputStream() {
+                         public int read() throws IOException {
+                             return zf.read();
+                         }
+                         public int read(byte[] b) throws IOException {
+                             return zf.read(b);
+                         }
+                    }) {
+                    extractFile(fileUtils, srcF, dir, is,
                                 ze.getName(), ze.getLastModifiedDate(),
                                 ze.isDirectory(), mapper);
-                } finally {
-                    FileUtils.close(is);
                 }
                 ze = zf.getNextEntry();
             }
diff --git a/src/main/org/apache/ant/compress/taskdefs/UnpackBase.java b/src/main/org/apache/ant/compress/taskdefs/UnpackBase.java
index 6c77f43..17ba7bb 100644
--- a/src/main/org/apache/ant/compress/taskdefs/UnpackBase.java
+++ b/src/main/org/apache/ant/compress/taskdefs/UnpackBase.java
@@ -19,9 +19,10 @@
 package org.apache.ant.compress.taskdefs;
 
 import java.io.BufferedInputStream;
-import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
 
 import org.apache.ant.compress.util.CompressorStreamFactory;
 import org.apache.ant.compress.util.CompressorWithConcatenatedStreamsFactory;
@@ -96,11 +97,9 @@
             log("Expanding " + source.getAbsolutePath() + " to "
                 + dest.getAbsolutePath());
 
-            FileOutputStream out = null;
             CompressorInputStream zIn = null;
             InputStream fis = null;
-            try {
-                out = new FileOutputStream(dest);
+            try (OutputStream out = Files.newOutputStream(dest.toPath())) {
                 zIn = StreamHelper.getInputStream(factory, srcResource);
                 if (zIn == null) {
                     fis = srcResource.getInputStream();
@@ -119,7 +118,6 @@
                 throw new BuildException(msg, ioe, getLocation());
             } finally {
                 FileUtils.close(fis);
-                FileUtils.close(out);
                 FileUtils.close(zIn);
             }
         }
diff --git a/src/main/org/apache/ant/compress/taskdefs/Unzip.java b/src/main/org/apache/ant/compress/taskdefs/Unzip.java
index aa47f15..075948a 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Unzip.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Unzip.java
@@ -52,15 +52,13 @@
     // overridden in order to take advantage of ZipFile
     protected void expandFile(FileUtils fileUtils, File srcF, File dir) {
         log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
-        ZipFile zf = null;
         FileNameMapper mapper = getMapper();
         if (!srcF.exists()) {
             throw new BuildException("Unable to expand " + srcF
                                      + " as the file does not exist",
                                      getLocation());
         }
-        try {
-            zf = new ZipFile(srcF, getEncoding(), true);
+        try (ZipFile zf = new ZipFile(srcF, getEncoding(), true)) {
             boolean empty = true;
             Enumeration e = zf.getEntries();
             while (e.hasMoreElements()) {
@@ -90,8 +88,6 @@
                 "Error while expanding " + srcF.getPath()
                 + "\n" + ioe.toString(),
                 ioe);
-        } finally {
-            ZipFile.closeQuietly(zf);
         }
     }
 
