aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/commons/io/output/AppendableWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/apache/commons/io/output/AppendableWriter.java')
-rw-r--r--src/main/java/org/apache/commons/io/output/AppendableWriter.java165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/io/output/AppendableWriter.java b/src/main/java/org/apache/commons/io/output/AppendableWriter.java
new file mode 100644
index 00000000..8e234e64
--- /dev/null
+++ b/src/main/java/org/apache/commons/io/output/AppendableWriter.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.io.output;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Objects;
+
+/**
+ * Writer implementation that writes the data to an {@link Appendable}
+ * Object.
+ * <p>
+ * For example, can be used with a {@link java.lang.StringBuilder}
+ * or {@link java.lang.StringBuffer}.
+ * </p>
+ *
+ * @since 2.7
+ * @see Appendable
+ *
+ * @param <T> The type of the {@link Appendable} wrapped by this AppendableWriter.
+ */
+public class AppendableWriter <T extends Appendable> extends Writer {
+
+ private final T appendable;
+
+ /**
+ * Constructs a new instance with the specified appendable.
+ *
+ * @param appendable the appendable to write to
+ */
+ public AppendableWriter(final T appendable) {
+ this.appendable = appendable;
+ }
+
+ /**
+ * Appends the specified character to the underlying appendable.
+ *
+ * @param c the character to append
+ * @return this writer
+ * @throws IOException upon error
+ */
+ @Override
+ public Writer append(final char c) throws IOException {
+ appendable.append(c);
+ return this;
+ }
+
+ /**
+ * Appends the specified character sequence to the underlying appendable.
+ *
+ * @param csq the character sequence to append
+ * @return this writer
+ * @throws IOException upon error
+ */
+ @Override
+ public Writer append(final CharSequence csq) throws IOException {
+ appendable.append(csq);
+ return this;
+ }
+
+ /**
+ * Appends a subsequence of the specified character sequence to the underlying appendable.
+ *
+ * @param csq the character sequence from which a subsequence will be appended
+ * @param start the index of the first character in the subsequence
+ * @param end the index of the character following the last character in the subsequence
+ * @return this writer
+ * @throws IOException upon error
+ */
+ @Override
+ public Writer append(final CharSequence csq, final int start, final int end) throws IOException {
+ appendable.append(csq, start, end);
+ return this;
+ }
+
+ /**
+ * Closes the stream. This implementation does nothing.
+ *
+ * @throws IOException upon error
+ */
+ @Override
+ public void close() throws IOException {
+ // noop
+ }
+
+ /**
+ * Flushes the stream. This implementation does nothing.
+ *
+ * @throws IOException upon error
+ */
+ @Override
+ public void flush() throws IOException {
+ // noop
+ }
+
+ /**
+ * Return the target appendable.
+ *
+ * @return the target appendable
+ */
+ public T getAppendable() {
+ return appendable;
+ }
+
+ /**
+ * Writes a portion of an array of characters to the underlying appendable.
+ *
+ * @param cbuf an array with the characters to write
+ * @param off offset from which to start writing characters
+ * @param len number of characters to write
+ * @throws IOException upon error
+ */
+ @Override
+ public void write(final char[] cbuf, final int off, final int len) throws IOException {
+ Objects.requireNonNull(cbuf, "Character array is missing");
+ if (len < 0 || off + len > cbuf.length) {
+ throw new IndexOutOfBoundsException("Array Size=" + cbuf.length +
+ ", offset=" + off + ", length=" + len);
+ }
+ for (int i = 0; i < len; i++) {
+ appendable.append(cbuf[off + i]);
+ }
+ }
+
+ /**
+ * Writes a character to the underlying appendable.
+ *
+ * @param c the character to write
+ * @throws IOException upon error
+ */
+ @Override
+ public void write(final int c) throws IOException {
+ appendable.append((char)c);
+ }
+
+ /**
+ * Writes a portion of a String to the underlying appendable.
+ *
+ * @param str a string
+ * @param off offset from which to start writing characters
+ * @param len number of characters to write
+ * @throws IOException upon error
+ */
+ @Override
+ public void write(final String str, final int off, final int len) throws IOException {
+ // appendable.append will add "null" for a null String; add an explicit null check
+ Objects.requireNonNull(str, "String is missing");
+ appendable.append(str, off, off + len);
+ }
+
+}