This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new fb78f68f Add AbstractStreamBuilder.setOpenOptions(OpenOption...)
fb78f68f is described below

commit fb78f68fc4edae1290f609b9ade0cba0cee52d6f
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Fri May 19 17:28:39 2023 -0400

    Add AbstractStreamBuilder.setOpenOptions(OpenOption...)
---
 src/changes/changes.xml                            |  3 +
 .../apache/commons/io/build/AbstractOrigin.java    |  4 +-
 .../commons/io/build/AbstractStreamBuilder.java    | 74 ++++++++++++++++++++++
 .../apache/commons/io/input/BOMInputStream.java    |  8 +--
 .../input/MessageDigestCalculatingInputStream.java |  8 +--
 .../commons/io/input/ReadAheadInputStream.java     |  8 +--
 .../io/input/UncheckedFilterInputStream.java       |  8 +--
 .../input/UnsynchronizedBufferedInputStream.java   |  8 +--
 .../io/input/UnsynchronizedFilterInputStream.java  |  8 +--
 .../apache/commons/io/input/XmlStreamReader.java   | 10 ++-
 .../io/output/UncheckedFilterOutputStream.java     |  8 +--
 .../commons/io/output/UncheckedFilterWriter.java   |  9 +--
 .../commons/io/output/WriterOutputStream.java      |  8 +--
 .../apache/commons/io/output/XmlStreamWriter.java  |  8 +--
 .../input/BufferedFileChannelInputStreamTest.java  |  4 +-
 .../io/input/RandomAccessFileInputStreamTest.java  | 24 +++++--
 .../commons/io/input/ReadAheadInputStreamTest.java |  4 +-
 .../commons/io/input/XmlStreamReaderTest.java      | 11 ++++
 .../commons/io/output/WriterOutputStreamTest.java  |  2 +
 19 files changed, 152 insertions(+), 65 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 02eb6b01..25df6a24 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -56,6 +56,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="fix" due-to="Gary Gregory">
         Add CharSequenceInputStream.Builder.
       </action>
+      <action dev="ggregory" type="fix" due-to="Gary Gregory">
+        Add AbstractStreamBuilder.setOpenOptions(OpenOption...).
+      </action>
       <!-- UPDATE -->
     </release>
     <release version="2.12.0" date="2023-05-13" description="Java 8 required.">
diff --git a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java 
b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java
index eadbb246..d2749b0e 100644
--- a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java
+++ b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java
@@ -293,7 +293,7 @@ public abstract class AbstractOrigin<T, B extends 
AbstractOrigin<T, B>> extends
      * @throws UnsupportedOperationException if this method is not implemented 
in a concrete subclass.
      */
     public File getFile() {
-        throw new UnsupportedOperationException(origin.toString());
+        throw new UnsupportedOperationException("getFile() from " + 
origin.toString());
     }
 
     /**
@@ -327,7 +327,7 @@ public abstract class AbstractOrigin<T, B extends 
AbstractOrigin<T, B>> extends
      * @throws UnsupportedOperationException if this method is not implemented 
in a concrete subclass.
      */
     public Path getPath() {
-        throw new UnsupportedOperationException(origin.toString());
+        throw new UnsupportedOperationException("getPath() from " + 
origin.toString());
     }
 
     /**
diff --git 
a/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java 
b/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java
index e938b7eb..3c34689f 100644
--- a/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java
+++ b/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java
@@ -17,10 +17,16 @@
 
 package org.apache.commons.io.build;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
 import java.nio.charset.Charset;
+import java.nio.file.OpenOption;
 
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Abstracts building a typed instance of {@code T}.
@@ -31,6 +37,8 @@ import org.apache.commons.io.IOUtils;
  */
 public abstract class AbstractStreamBuilder<T, B extends 
AbstractStreamBuilder<T, B>> extends AbstractOriginSupplier<T, B> {
 
+    private static final OpenOption[] DEFAULT_OPEN_OPTIONS = 
PathUtils.EMPTY_OPEN_OPTION_ARRAY;
+
     /**
      * The buffer size, defaults to {@link IOUtils#DEFAULT_BUFFER_SIZE} 
({@value IOUtils#DEFAULT_BUFFER_SIZE}).
      */
@@ -51,6 +59,8 @@ public abstract class AbstractStreamBuilder<T, B extends 
AbstractStreamBuilder<T
      */
     private Charset charsetDefault = Charset.defaultCharset();
 
+    private OpenOption[] openOptions = DEFAULT_OPEN_OPTIONS;
+
     /**
      * Gets the buffer size, defaults to {@link IOUtils#DEFAULT_BUFFER_SIZE} 
({@value IOUtils#DEFAULT_BUFFER_SIZE}).
      *
@@ -87,6 +97,49 @@ public abstract class AbstractStreamBuilder<T, B extends 
AbstractStreamBuilder<T
         return charsetDefault;
     }
 
+    /**
+     * Gets an input stream from the origin with open options.
+     *
+     * @return An input stream
+     * @throws IOException                   if an I/O error occurs.
+     * @throws UnsupportedOperationException if the origin cannot be converted 
to an InputStream.
+     * @see AbstractOrigin#getInputStream(OpenOption...)
+     * @since 2.13.0
+     */
+    protected InputStream getInputStream() throws IOException {
+        return getOrigin().getInputStream(getOpenOptions());
+    }
+
+    protected OpenOption[] getOpenOptions() {
+        return openOptions;
+    }
+
+    /**
+     * Gets an output stream from the origin with open options.
+     *
+     * @return An input stream
+     * @throws IOException                   if an I/O error occurs.
+     * @throws UnsupportedOperationException if the origin cannot be converted 
to an OututStream.
+     * @see AbstractOrigin#getOutputStream(OpenOption...)
+     * @since 2.13.0
+     */
+    protected OutputStream getOutputStream() throws IOException {
+        return getOrigin().getOutputStream(getOpenOptions());
+    }
+
+    /**
+     * Gets an writer from the origin with open options.
+     *
+     * @return An writer.
+     * @throws IOException                   if an I/O error occurs.
+     * @throws UnsupportedOperationException if the origin cannot be converted 
to a Writer.
+     * @see AbstractOrigin#getOutputStream(OpenOption...)
+     * @since 2.13.0
+     */
+    protected Writer getWriter() throws IOException {
+        return getOrigin().getWriter(getCharset(), getOpenOptions());
+    }
+
     /**
      * Sets the buffer size.
      * <p>
@@ -169,4 +222,25 @@ public abstract class AbstractStreamBuilder<T, B extends 
AbstractStreamBuilder<T
         this.charsetDefault = defaultCharset;
         return asThis();
     }
+
+    /**
+     * Sets the OpenOption[].
+     * <p>
+     * Normally used with InputStream, OutputStream, and Writer.
+     * </p>
+     * <p>
+     * Subclasses may ignore this setting.
+     * </p>
+     *
+     * @param openOptions the OpenOption[] name, null resets to the default.
+     * @return this.
+     * @since 2.13.0
+     * @see #setInputStream(InputStream)
+     * @see #setOutputStream(OutputStream)
+     * @see #setWriter(Writer)
+     */
+    public B setOpenOptions(final OpenOption... openOptions) {
+        this.openOptions = openOptions != null ? openOptions : 
DEFAULT_OPEN_OPTIONS;
+        return asThis();
+    }
 }
diff --git a/src/main/java/org/apache/commons/io/input/BOMInputStream.java 
b/src/main/java/org/apache/commons/io/input/BOMInputStream.java
index d6dedd62..abc528ee 100644
--- a/src/main/java/org/apache/commons/io/input/BOMInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/BOMInputStream.java
@@ -20,7 +20,6 @@ import static org.apache.commons.io.IOUtils.EOF;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.OpenOption;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
@@ -28,7 +27,6 @@ import java.util.Objects;
 
 import org.apache.commons.io.ByteOrderMark;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
@@ -136,7 +134,7 @@ public class BOMInputStream extends ProxyInputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspects InputStream, include, and 
ByteOrderMark[].
+         * This builder use the aspects InputStream, OpenOption[], include, 
and ByteOrderMark[].
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -145,12 +143,12 @@ public class BOMInputStream extends ProxyInputStream {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @SuppressWarnings("resource")
         @Override
         public BOMInputStream get() throws IOException {
-            return new BOMInputStream(getOrigin().getInputStream(), include, 
byteOrderMarks);
+            return new BOMInputStream(getInputStream(), include, 
byteOrderMarks);
         }
 
         /**
diff --git 
a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
 
b/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
index 581da635..0ee92f7c 100644
--- 
a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
+++ 
b/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
@@ -18,12 +18,10 @@ package org.apache.commons.io.input;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.OpenOption;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.Provider;
 
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
@@ -75,7 +73,7 @@ public class MessageDigestCalculatingInputStream extends 
ObservableInputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspects InputStream and MessageDigest.
+         * This builder use the aspects InputStream, OpenOption[], and 
MessageDigest.
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -84,12 +82,12 @@ public class MessageDigestCalculatingInputStream extends 
ObservableInputStream {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @SuppressWarnings("resource")
         @Override
         public MessageDigestCalculatingInputStream get() throws IOException {
-            return new 
MessageDigestCalculatingInputStream(getOrigin().getInputStream(), 
messageDigest);
+            return new MessageDigestCalculatingInputStream(getInputStream(), 
messageDigest);
         }
 
         /**
diff --git 
a/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java 
b/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java
index bad740c3..d4790ba4 100644
--- a/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.nio.ByteBuffer;
-import java.nio.file.OpenOption;
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -31,7 +30,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
 
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
@@ -71,7 +69,7 @@ public class ReadAheadInputStream extends FilterInputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspects InputStream, buffer size, 
ExecutorService.
+         * This builder use the aspects InputStream, OpenOption[], buffer 
size, ExecutorService.
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -80,12 +78,12 @@ public class ReadAheadInputStream extends FilterInputStream 
{
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @SuppressWarnings("resource")
         @Override
         public ReadAheadInputStream get() throws IOException {
-            return new ReadAheadInputStream(getOrigin().getInputStream(), 
getBufferSize(), executorService != null ? executorService : 
newExecutorService(),
+            return new ReadAheadInputStream(getInputStream(), getBufferSize(), 
executorService != null ? executorService : newExecutorService(),
                     executorService == null);
         }
 
diff --git 
a/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java 
b/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java
index 05414782..58609c10 100644
--- a/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java
@@ -22,9 +22,7 @@ import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UncheckedIOException;
-import java.nio.file.OpenOption;
 
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 import org.apache.commons.io.function.Uncheck;
 
@@ -65,7 +63,7 @@ public final class UncheckedFilterInputStream extends 
FilterInputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspect InputStream.
+         * This builder use the aspect InputStream and OpenOption[].
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -74,12 +72,12 @@ public final class UncheckedFilterInputStream extends 
FilterInputStream {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @Override
         public UncheckedFilterInputStream get() {
             // This an unchecked class, so this method is as well.
-            return Uncheck.get(() -> new 
UncheckedFilterInputStream(getOrigin().getInputStream()));
+            return Uncheck.get(() -> new 
UncheckedFilterInputStream(getInputStream()));
         }
 
     }
diff --git 
a/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java
 
b/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java
index 1034609c..ffd456df 100644
--- 
a/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java
+++ 
b/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java
@@ -20,10 +20,8 @@ package org.apache.commons.io.input;
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.OpenOption;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
@@ -82,7 +80,7 @@ public final class UnsynchronizedBufferedInputStream extends 
UnsynchronizedFilte
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspects InputStream and buffer size.
+         * This builder use the aspects InputStream, OpenOption[] and buffer 
size.
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -91,12 +89,12 @@ public final class UnsynchronizedBufferedInputStream 
extends UnsynchronizedFilte
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @SuppressWarnings("resource") // Caller closes.
         @Override
         public UnsynchronizedBufferedInputStream get() throws IOException {
-            return new 
UnsynchronizedBufferedInputStream(getOrigin().getInputStream(), 
getBufferSize());
+            return new UnsynchronizedBufferedInputStream(getInputStream(), 
getBufferSize());
         }
 
     }
diff --git 
a/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java
 
b/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java
index 698f42d8..0465cd6b 100644
--- 
a/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java
+++ 
b/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java
@@ -20,9 +20,7 @@ package org.apache.commons.io.input;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.OpenOption;
 
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
@@ -69,7 +67,7 @@ public class UnsynchronizedFilterInputStream extends 
InputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspect InputStream.
+         * This builder use the aspect InputStream and OpenOption[].
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -78,12 +76,12 @@ public class UnsynchronizedFilterInputStream extends 
InputStream {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @SuppressWarnings("resource") // Caller closes.
         @Override
         public UnsynchronizedFilterInputStream get() throws IOException {
-            return new 
UnsynchronizedFilterInputStream(getOrigin().getInputStream());
+            return new UnsynchronizedFilterInputStream(getInputStream());
         }
 
     }
diff --git a/src/main/java/org/apache/commons/io/input/XmlStreamReader.java 
b/src/main/java/org/apache/commons/io/input/XmlStreamReader.java
index 251375d9..2e2f0f42 100644
--- a/src/main/java/org/apache/commons/io/input/XmlStreamReader.java
+++ b/src/main/java/org/apache/commons/io/input/XmlStreamReader.java
@@ -30,7 +30,6 @@ import java.net.URLConnection;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.text.MessageFormat;
 import java.util.Locale;
@@ -41,7 +40,6 @@ import java.util.regex.Pattern;
 import org.apache.commons.io.ByteOrderMark;
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 import org.apache.commons.io.function.IOConsumer;
 import org.apache.commons.io.output.XmlStreamWriter;
@@ -123,7 +121,7 @@ public class XmlStreamReader extends Reader {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspect InputStream, httpContentType, lenient, 
and defaultEncoding.
+         * This builder use the aspect InputStream, OpenOption[], 
httpContentType, lenient, and defaultEncoding.
          * </p>
          * <p>
          * You must provide an origin that can be converted to an InputStream 
by this builder, otherwise, this call will throw an
@@ -134,7 +132,7 @@ public class XmlStreamReader extends Reader {
          * @throws UnsupportedOperationException if the origin cannot provide 
an InputStream.
          * @throws IOException                   thrown if there is a problem 
reading the stream.
          * @throws XmlStreamReaderException      thrown if the charset 
encoding could not be determined according to the specification.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getInputStream()
          */
         @SuppressWarnings("resource")
         @Override
@@ -142,8 +140,8 @@ public class XmlStreamReader extends Reader {
             final String defaultEncoding = nullCharset ? null : 
getCharset().name();
             // @formatter:off
             return httpContentType == null
-                    ? new XmlStreamReader(getOrigin().getInputStream(), 
lenient, defaultEncoding)
-                    : new XmlStreamReader(getOrigin().getInputStream(), 
httpContentType, lenient, defaultEncoding);
+                    ? new XmlStreamReader(getInputStream(), lenient, 
defaultEncoding)
+                    : new XmlStreamReader(getInputStream(), httpContentType, 
lenient, defaultEncoding);
             // @formatter:on
         }
 
diff --git 
a/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java 
b/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java
index 3a0978ca..c1e9b7ae 100644
--- 
a/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java
+++ 
b/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java
@@ -21,9 +21,7 @@ import java.io.FilterOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UncheckedIOException;
-import java.nio.file.OpenOption;
 
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 import org.apache.commons.io.function.Uncheck;
 
@@ -64,7 +62,7 @@ public final class UncheckedFilterOutputStream extends 
FilterOutputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspect OutputStream.
+         * This builder use the aspect OutputStream and OpenOption[].
          * </p>
          * <p>
          * You must provide an origin that can be converted to an OutputStream 
by this builder, otherwise, this call will throw an
@@ -73,12 +71,12 @@ public final class UncheckedFilterOutputStream extends 
FilterOutputStream {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an OutputStream.
-         * @see AbstractOrigin#getOutputStream(OpenOption...)
+         * @see #getOutputStream()
          */
         @SuppressWarnings("resource")
         @Override
         public UncheckedFilterOutputStream get() throws IOException {
-            return new 
UncheckedFilterOutputStream(getOrigin().getOutputStream());
+            return new UncheckedFilterOutputStream(getOutputStream());
         }
 
     }
diff --git 
a/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java 
b/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java
index 45c7f83a..14a98226 100644
--- a/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java
+++ b/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java
@@ -21,10 +21,7 @@ import java.io.FilterWriter;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.io.Writer;
-import java.nio.charset.Charset;
-import java.nio.file.OpenOption;
 
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 import org.apache.commons.io.function.Uncheck;
 
@@ -65,7 +62,7 @@ public final class UncheckedFilterWriter extends FilterWriter 
{
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspects Writer and Charset.
+         * This builder use the aspects Writer, OpenOption[], and Charset.
          * </p>
          * <p>
          * You must provide an origin that can be converted to a Writer by 
this builder, otherwise, this call will throw an
@@ -74,12 +71,12 @@ public final class UncheckedFilterWriter extends 
FilterWriter {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
a Writer.
-         * @see AbstractOrigin#getWriter(Charset, OpenOption...)
+         * @see #getWriter()
          */
         @SuppressWarnings("resource")
         @Override
         public UncheckedFilterWriter get() throws IOException {
-            return new 
UncheckedFilterWriter(getOrigin().getWriter(getCharset()));
+            return new UncheckedFilterWriter(getWriter());
         }
 
     }
diff --git a/src/main/java/org/apache/commons/io/output/WriterOutputStream.java 
b/src/main/java/org/apache/commons/io/output/WriterOutputStream.java
index c1456785..8e67fc96 100644
--- a/src/main/java/org/apache/commons/io/output/WriterOutputStream.java
+++ b/src/main/java/org/apache/commons/io/output/WriterOutputStream.java
@@ -26,11 +26,9 @@ import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CoderResult;
 import java.nio.charset.CodingErrorAction;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.OpenOption;
 
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 import org.apache.commons.io.charset.CharsetDecoders;
 
@@ -108,7 +106,7 @@ public class WriterOutputStream extends OutputStream {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspect Writer, Charset, CharsetDecoder, buffer 
size and writeImmediately.
+         * This builder use the aspect Writer, OpenOption[], Charset, 
CharsetDecoder, buffer size and writeImmediately.
          * </p>
          * <p>
          * You must provide an origin that can be converted to a Writer by 
this builder, otherwise, this call will throw an
@@ -117,12 +115,12 @@ public class WriterOutputStream extends OutputStream {
          *
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
a Writer.
-         * @see AbstractOrigin#getWriter(Charset, OpenOption...)
+         * @see #getWriter()
          */
         @SuppressWarnings("resource")
         @Override
         public WriterOutputStream get() throws IOException {
-            return new WriterOutputStream(getOrigin().getWriter(getCharset()), 
charsetDecoder, getBufferSize(), writeImmediately);
+            return new WriterOutputStream(getWriter(), charsetDecoder, 
getBufferSize(), writeImmediately);
         }
 
         @Override
diff --git a/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java 
b/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java
index 462c6028..53509447 100644
--- a/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java
+++ b/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java
@@ -26,14 +26,12 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.OpenOption;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.regex.Matcher;
 
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.build.AbstractOrigin;
 import org.apache.commons.io.build.AbstractStreamBuilder;
 import org.apache.commons.io.input.XmlStreamReader;
 
@@ -72,7 +70,7 @@ public class XmlStreamWriter extends Writer {
         /**
          * Constructs a new instance.
          * <p>
-         * This builder use the aspect OutputStream and Charset.
+         * This builder use the aspect OutputStream, OpenOption[], and Charset.
          * </p>
          * <p>
          * You must provide an origin that can be converted to an OutputStream 
by this builder, otherwise, this call will throw an
@@ -82,12 +80,12 @@ public class XmlStreamWriter extends Writer {
          * @return a new instance.
          * @throws UnsupportedOperationException if the origin cannot provide 
an OutputStream.
          * @throws IOException                   if an I/O error occurs.
-         * @see AbstractOrigin#getInputStream(OpenOption...)
+         * @see #getOutputStream()
          */
         @SuppressWarnings("resource")
         @Override
         public XmlStreamWriter get() throws IOException {
-            return new XmlStreamWriter(getOrigin().getOutputStream(), 
getCharset());
+            return new XmlStreamWriter(getOutputStream(), getCharset());
         }
 
     }
diff --git 
a/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java
 
b/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java
index 758d96c3..0a56ae8e 100644
--- 
a/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java
@@ -18,6 +18,7 @@ package org.apache.commons.io.input;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.StandardOpenOption;
 
 import org.junit.jupiter.api.BeforeEach;
 
@@ -40,7 +41,8 @@ public class BufferedFileChannelInputStreamTest extends 
AbstractInputStreamTest
             new BufferedFileChannelInputStream(inputFile, 123), // small, 
unaligned buffer size
             BufferedFileChannelInputStream.builder().setPath(inputFile).get(), 
// default
             
BufferedFileChannelInputStream.builder().setPath(inputFile).setBufferSize(123).get(),
 // small, unaligned buffer size
-            
BufferedFileChannelInputStream.builder().setURI(inputFile.toUri()).setBufferSize(1024).get()
 // URI and buffer size
+            
BufferedFileChannelInputStream.builder().setURI(inputFile.toUri()).setBufferSize(1024).get(),
 // URI and buffer size
+            
BufferedFileChannelInputStream.builder().setPath(inputFile).setOpenOptions(StandardOpenOption.READ).get(),
 // open options
         };
         //@formatter:on
     }
diff --git 
a/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java
 
b/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java
index 51ab0409..80137c9d 100644
--- 
a/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java
+++ 
b/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java
@@ -29,18 +29,21 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 
 import org.apache.commons.io.RandomAccessFileMode;
 import org.junit.jupiter.api.Test;
 
 public class RandomAccessFileInputStreamTest {
 
-    private static final String DATA_FILE = 
"src/test/resources/org/apache/commons/io/test-file-iso8859-1.bin";
+    private static final String DATA_FILE_NAME = 
"src/test/resources/org/apache/commons/io/test-file-iso8859-1.bin";
+    private static final Path DATA_PATH = Paths.get(DATA_FILE_NAME);
     private static final int DATA_FILE_LEN = 1430;
 
     private RandomAccessFile createRandomAccessFile() throws 
FileNotFoundException {
-        return RandomAccessFileMode.READ_ONLY.create(DATA_FILE);
+        return RandomAccessFileMode.READ_ONLY.create(DATA_FILE_NAME);
     }
 
     @Test
@@ -63,7 +66,7 @@ public class RandomAccessFileInputStreamTest {
     @Test
     public void testBuilderFile() throws IOException {
         try (RandomAccessFile file = createRandomAccessFile()) {
-            try (RandomAccessFileInputStream inputStream = 
RandomAccessFileInputStream.builder().setFile(new File(DATA_FILE)).get()) {
+            try (RandomAccessFileInputStream inputStream = 
RandomAccessFileInputStream.builder().setFile(new File(DATA_FILE_NAME)).get()) {
                 assertFalse(inputStream.isCloseOnClose());
                 assertNotEquals(-1, inputStream.getRandomAccessFile().read());
             }
@@ -75,7 +78,20 @@ public class RandomAccessFileInputStreamTest {
     @Test
     public void testBuilderPath() throws IOException {
         try (RandomAccessFile file = createRandomAccessFile()) {
-            try (RandomAccessFileInputStream inputStream = 
RandomAccessFileInputStream.builder().setPath(Paths.get(DATA_FILE)).get()) {
+            try (RandomAccessFileInputStream inputStream = 
RandomAccessFileInputStream.builder().setPath(DATA_PATH).get()) {
+                assertFalse(inputStream.isCloseOnClose());
+                assertNotEquals(-1, inputStream.getRandomAccessFile().read());
+            }
+            file.read();
+        }
+    }
+
+    @SuppressWarnings("resource") // instance variable access
+    @Test
+    public void testBuilderPathOpenOptions() throws IOException {
+        try (RandomAccessFile file = createRandomAccessFile()) {
+            try (RandomAccessFileInputStream inputStream = 
RandomAccessFileInputStream.builder().setPath(DATA_PATH).setOpenOptions(StandardOpenOption.READ)
+                    .get()) {
                 assertFalse(inputStream.isCloseOnClose());
                 assertNotEquals(-1, inputStream.getRandomAccessFile().read());
             }
diff --git 
a/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java 
b/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java
index 125a8681..959932cb 100644
--- a/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java
@@ -18,6 +18,7 @@ package org.apache.commons.io.input;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.StandardOpenOption;
 
 import org.junit.jupiter.api.BeforeEach;
 
@@ -54,6 +55,7 @@ public class ReadAheadInputStreamTest extends 
AbstractInputStreamTest {
                 // Tests unaligned buffers, wrapped bigger than outer.
                 ReadAheadInputStream.builder().setInputStream(new 
BufferedFileChannelInputStream(inputFile, 321)).setBufferSize(123).get(),
                 // Tests unaligned buffers, wrapped smaller than outer.
-                ReadAheadInputStream.builder().setInputStream(new 
BufferedFileChannelInputStream(inputFile, 123)).setBufferSize(321).get() };
+                ReadAheadInputStream.builder().setInputStream(new 
BufferedFileChannelInputStream(inputFile, 123)).setBufferSize(321).get(),
+                
ReadAheadInputStream.builder().setPath(inputFile).setOpenOptions(StandardOpenOption.READ).get()
 };
     }
 }
diff --git a/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java 
b/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java
index 8af91b01..e57da885 100644
--- a/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java
+++ b/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java
@@ -34,6 +34,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.text.MessageFormat;
 import java.util.HashMap;
 import java.util.Map;
@@ -204,6 +205,16 @@ public class XmlStreamReaderTest {
         }
     }
 
+    @Test
+    protected void testConstructorFileInputOpenOptions() throws IOException {
+        try (XmlStreamReader reader = new XmlStreamReader(new 
File("pom.xml"))) {
+            // do nothing
+        }
+        try (XmlStreamReader reader = 
XmlStreamReader.builder().setFile("pom.xml").setOpenOptions(StandardOpenOption.READ).get())
 {
+            // do nothing
+        }
+    }
+
     @Test
     protected void testConstructorFileInputNull() {
         assertThrows(NullPointerException.class, () -> new 
XmlStreamReader((File) null));
diff --git 
a/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java 
b/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java
index 8125fed4..10aad5f0 100644
--- a/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java
@@ -24,6 +24,7 @@ import java.io.StringWriter;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.StandardOpenOption;
 import java.util.Random;
 
 import org.apache.commons.io.Charsets;
@@ -219,6 +220,7 @@ public class WriterOutputStreamTest {
                 .setCharset("us-ascii")
                 .setBufferSize(1024)
                 .setWriteImmediately(true)
+                .setOpenOptions(StandardOpenOption.CREATE, 
StandardOpenOption.READ, StandardOpenOption.WRITE)
                 .get()) {
             // @formatter:on
             out.write("abc".getBytes(StandardCharsets.US_ASCII));


Reply via email to