Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ed20f2a
[IO-856] Try test on all OSs for GitHub CI
garydgregory Nov 10, 2024
cb5359f
Merge remote-tracking branch 'upstream/master'
garydgregory Oct 19, 2025
3fe03be
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 3, 2025
b5747b1
Merge remote-tracking branch 'upstream/master'
garydgregory Dec 7, 2025
515ae1e
Merge remote-tracking branch 'upstream/master'
garydgregory Dec 10, 2025
8192a78
Merge remote-tracking branch 'upstream/master'
garydgregory Dec 13, 2025
c780069
Merge remote-tracking branch 'upstream/master'
garydgregory Dec 14, 2025
6924d71
Merge remote-tracking branch 'upstream/master'
garydgregory Jan 1, 2026
3b77da2
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 5, 2026
abdd9e1
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 15, 2026
fb91287
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 19, 2026
b165180
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 21, 2026
2dd0ddf
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 21, 2026
bd3f8b5
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 22, 2026
b34ea84
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 25, 2026
c74f241
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 25, 2026
1d2b754
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 26, 2026
c884a14
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 26, 2026
02cab72
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 26, 2026
cd3271f
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 28, 2026
c6a8cba
Merge remote-tracking branch 'upstream/master'
garydgregory Mar 30, 2026
21b928b
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 5, 2026
270d342
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 6, 2026
4f3d009
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 7, 2026
c8c7881
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 8, 2026
02ea2f8
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 28, 2026
3598f66
Add org.apache.commons.io.IOUtils.closeQuietly(AutoCloseable[,
garydgregory Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 64 additions & 9 deletions src/main/java/org/apache/commons/io/IOUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -779,6 +779,69 @@ private static void closeQ(final Closeable closeable) {
closeQuietly(closeable, (Consumer<Exception>) null);
}

/**
* Closes a {@link AutoCloseable} unconditionally.
* <p>
* Equivalent to {@link AutoCloseable#close()}, except any exceptions will be ignored. This is typically used in finally blocks.
* <p>
* Example code:
* </p>
*
* <pre>
* AutoCloseable closeable = null;
* try {
* closeable = new FileReader(&quot;foo.txt&quot;);
* // process closeable
* closeable.close();
* } catch (Exception e) {
* // error handling
* } finally {
* IOUtils.closeQuietly(closeable);
* }
* </pre>
* <p>
* Closing all streams:
* </p>
*
* <pre>
* try {
* return IOUtils.copy(inputStream, outputStream);
* } finally {
* IOUtils.closeQuietly(inputStream);
* IOUtils.closeQuietly(outputStream);
* }
* </pre>
* <p>
* Also consider using a try-with-resources statement where appropriate.
* </p>
*
* @param closeable the objects to close, may be null or already closed.
* @since 2.23.0
* @see Throwable#addSuppressed(Throwable)
*/
public static void closeQuietly(final AutoCloseable closeable) {
closeQuietly(closeable, (Consumer<Exception>) null);
}

/**
* Closes the given {@link AutoCloseable} as a null-safe operation while consuming IOException by the given {@code consumer}.
*
* @param closeable The resource to close, may be null.
* @param consumer Consumes the Exception thrown by {@link AutoCloseable#close()}.
* @since 2.23.0
*/
public static void closeQuietly(final AutoCloseable closeable, final Consumer<Exception> consumer) {
if (closeable != null) {
try {
closeable.close();
} catch (final Exception e) {
if (consumer != null) {
consumer.accept(e);
}
}
}
}

/**
* Closes a {@link Closeable} unconditionally.
* <p>
Expand Down Expand Up @@ -885,15 +948,7 @@ public static void closeQuietly(final Closeable... closeables) {
* @since 2.7
*/
public static void closeQuietly(final Closeable closeable, final Consumer<Exception> consumer) {
if (closeable != null) {
try {
closeable.close();
} catch (final Exception e) {
if (consumer != null) {
consumer.accept(e);
}
}
}
closeQuietly((AutoCloseable) closeable, consumer);
}

/**
Expand Down
Loading
Loading