/*
* 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 java.io;
/**
* StringWriter is an class for writing Character Streams to a StringBuffer. The
* characters written can then be returned as a String. This is used for
* capturing output sent to a Writer by substituting a StringWriter.
*
* @see StringReader
*/
public class StringWriter extends Writer {
private StringBuffer buf;
/**
* Constructs a new StringWriter which has a StringBuffer allocated with the
* default size of 16 characters. The StringBuffer is also the
* lock
used to synchronize access to this Writer.
*/
public StringWriter() {
super();
buf = new StringBuffer(16);
lock = buf;
}
/**
* Constructs a new StringWriter which has a StringBuffer allocated with the
* size of initialSize
characters. The StringBuffer is also
* the lock
used to synchronize access to this Writer.
*
* @param initialSize
* the intial number of characters
*/
public StringWriter(int initialSize) {
if (initialSize < 0) {
throw new IllegalArgumentException();
}
buf = new StringBuffer(initialSize);
lock = buf;
}
/**
* Close this Writer. This is the concrete implementation required. This
* particular implementation does nothing.
*
* @throws IOException
* If an IO error occurs closing this StringWriter.
*/
@Override
public void close() throws IOException {
/* empty */
}
/**
* Flush this Writer. This is the concrete implementation required. This
* particular implementation does nothing.
*/
@Override
public void flush() {
/* empty */
}
/**
* Answer the contents of this StringWriter as a StringBuffer. Any changes
* made to the StringBuffer by the receiver or the caller are reflected in
* this StringWriter.
*
* @return this StringWriters local StringBuffer.
*/
public StringBuffer getBuffer() {
synchronized (lock) {
return buf;
}
}
/**
* Answer the contents of this StringWriter as a String. Any changes made to
* the StringBuffer by the receiver after returning will not be reflected in
* the String returned to the caller.
*
* @return this StringWriters current contents as a String.
*/
@Override
public String toString() {
synchronized (lock) {
return buf.toString();
}
}
/**
* Writes count
characters starting at offset
* in cbuf
to this StringWriter.
*
* @param cbuf
* the non-null array containing characters to write.
* @param offset
* offset in buf to retrieve characters
* @param count
* maximum number of characters to write
*
* @throws ArrayIndexOutOfBoundsException
* If offset or count are outside of bounds.
*/
@Override
public void write(char[] cbuf, int offset, int count) {
// avoid int overflow
if (offset < 0 || offset > cbuf.length || count < 0
|| count > cbuf.length - offset) {
throw new IndexOutOfBoundsException();
}
synchronized (lock) {
this.buf.append(cbuf, offset, count);
}
}
/**
* Writes the specified character oneChar
to this
* StringWriter. This implementation writes the low order two bytes to the
* Stream.
*
* @param oneChar
* The character to write
*/
@Override
public void write(int oneChar) {
synchronized (lock) {
buf.append((char) oneChar);
}
}
/**
* Writes the characters from the String str
to this
* StringWriter.
*
* @param str
* the non-null String containing the characters to write.
*/
@Override
public void write(String str) {
synchronized (lock) {
buf.append(str);
}
}
/**
* Writes count
number of characters starting at
* offset
from the String str
to this
* StringWriter.
*
* @param str
* the non-null String containing the characters to write.
* @param offset
* the starting point to retrieve characters.
* @param count
* the number of characters to retrieve and write.
*
* @throws ArrayIndexOutOfBoundsException
* If offset or count are outside of bounds.
*/
@Override
public void write(String str, int offset, int count) {
String sub = str.substring(offset, offset + count);
synchronized (lock) {
buf.append(sub);
}
}
/**
* Append a char c
to the StringWriter. The
* StringWriter.append(c
) works the same way as
* StringWriter.write(c
).
*
* @param c
* The character appended to the StringWriter.
* @return The StringWriter.
*/
@Override
public StringWriter append(char c) {
write(c);
return this;
}
/**
* Append a CharSequence csq
to the StringWriter. The
* StringWriter.append(csq
) works the same way as
* StringWriter.write(csq
.toString()). If csq
* is null, then "null" will be substituted for csq
.
*
* @param csq
* The CharSequence appended to the StringWriter.
* @return The StringWriter
*/
@Override
public StringWriter append(CharSequence csq) {
if (null == csq) {
append(TOKEN_NULL, 0, TOKEN_NULL.length());
} else {
append(csq, 0, csq.length());
}
return this;
}
/**
* Append a subsequence of a CharSequence csq
to the
* StringWriter. The first char and the last char of the subsequnce is
* specified by the parameter start
and end
.
* The StringWriter.append(csq
) works the same way as
* StringWriter.write(csq
.subSequence(start
,end
).toString).If
* csq
is null, then "null" will be substituted for
* csq
. s
*
* @param csq
* The CharSequence appended to the StringWriter.
* @param start
* The index of the first char in the CharSequence appended to
* the StringWriter.
* @param end
* The index of the char after the last one in the CharSequence
* appended to the StringWriter.
* @return The StringWriter.
* @throws IndexOutOfBoundsException
* If start is less than end, end is greater than the length of
* the CharSequence, or start or end is negative.
*/
@Override
public StringWriter append(CharSequence csq, int start, int end) {
if (null == csq) {
csq = TOKEN_NULL;
}
String output = csq.subSequence(start, end).toString();
write(output, 0, output.length());
return this;
}
}