1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache license, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the license for the specific language governing permissions and 15 * limitations under the license. 16 */ 17 package org.apache.logging.log4j.core.util; 18 19 import java.io.Serializable; 20 import java.io.Writer; 21 22 /** 23 * {@link Writer} implementation that outputs to a {@link StringBuilder}. 24 * <p> 25 * <strong>NOTE:</strong> This implementation, as an alternative to 26 * <code>java.io.StringWriter</code>, provides an <i>un-synchronized</i> 27 * (i.e. for use in a single thread) implementation for better performance. 28 * For safe usage with multiple {@link Thread}s then 29 * <code>java.io.StringWriter</code> should be used. 30 * 31 * Copied from Apache Commons IO revision 1681000. 32 */ 33 public class StringBuilderWriter extends Writer implements Serializable { 34 35 private static final long serialVersionUID = -146927496096066153L; 36 private final StringBuilder builder; 37 38 /** 39 * Construct a new {@link StringBuilder} instance with default capacity. 40 */ 41 public StringBuilderWriter() { 42 this.builder = new StringBuilder(); 43 } 44 45 /** 46 * Construct a new {@link StringBuilder} instance with the specified capacity. 47 * 48 * @param capacity The initial capacity of the underlying {@link StringBuilder} 49 */ 50 public StringBuilderWriter(final int capacity) { 51 this.builder = new StringBuilder(capacity); 52 } 53 54 /** 55 * Construct a new instance with the specified {@link StringBuilder}. 56 * 57 * <p>If {@code builder} is null a new instance with default capacity will be created.</p> 58 * 59 * @param builder The String builder. May be null. 60 */ 61 public StringBuilderWriter(final StringBuilder builder) { 62 this.builder = builder != null ? builder : new StringBuilder(); 63 } 64 65 /** 66 * Append a single character to this Writer. 67 * 68 * @param value The character to append 69 * @return This writer instance 70 */ 71 @Override 72 public Writer append(final char value) { 73 builder.append(value); 74 return this; 75 } 76 77 /** 78 * Append a character sequence to this Writer. 79 * 80 * @param value The character to append 81 * @return This writer instance 82 */ 83 @Override 84 public Writer append(final CharSequence value) { 85 builder.append(value); 86 return this; 87 } 88 89 /** 90 * Append a portion of a character sequence to the {@link StringBuilder}. 91 * 92 * @param value The character to append 93 * @param start The index of the first character 94 * @param end The index of the last character + 1 95 * @return This writer instance 96 */ 97 @Override 98 public Writer append(final CharSequence value, final int start, final int end) { 99 builder.append(value, start, end); 100 return this; 101 } 102 103 /** 104 * Closing this writer has no effect. 105 */ 106 @Override 107 public void close() { 108 // no-op 109 } 110 111 /** 112 * Flushing this writer has no effect. 113 */ 114 @Override 115 public void flush() { 116 // no-op 117 } 118 119 120 /** 121 * Write a String to the {@link StringBuilder}. 122 * 123 * @param value The value to write 124 */ 125 @Override 126 public void write(final String value) { 127 if (value != null) { 128 builder.append(value); 129 } 130 } 131 132 /** 133 * Write a portion of a character array to the {@link StringBuilder}. 134 * 135 * @param value The value to write 136 * @param offset The index of the first character 137 * @param length The number of characters to write 138 */ 139 @Override 140 public void write(final char[] value, final int offset, final int length) { 141 if (value != null) { 142 builder.append(value, offset, length); 143 } 144 } 145 146 /** 147 * Return the underlying builder. 148 * 149 * @return The underlying builder 150 */ 151 public StringBuilder getBuilder() { 152 return builder; 153 } 154 155 /** 156 * Returns {@link StringBuilder#toString()}. 157 * 158 * @return The contents of the String builder. 159 */ 160 @Override 161 public String toString() { 162 return builder.toString(); 163 } 164 }