<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FFile%2FByteArrayOutputStream</id>
		<title>Java Tutorial/File/ByteArrayOutputStream - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FFile%2FByteArrayOutputStream"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/File/ByteArrayOutputStream&amp;action=history"/>
		<updated>2026-04-22T07:53:24Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/File/ByteArrayOutputStream&amp;diff=5362&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/File/ByteArrayOutputStream&amp;diff=5362&amp;oldid=prev"/>
				<updated>2010-06-01T05:19:53Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 05:19, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/File/ByteArrayOutputStream&amp;diff=5361&amp;oldid=prev</id>
		<title> в 17:44, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/File/ByteArrayOutputStream&amp;diff=5361&amp;oldid=prev"/>
				<updated>2010-05-31T17:44:27Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==  A speedy implementation of ByteArrayOutputStream. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 2002-2003 by OpenSymphony&lt;br /&gt;
 * All rights reserved.&lt;br /&gt;
 */&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.RandomAccessFile;&lt;br /&gt;
import java.io.Writer;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.LinkedList;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A speedy implementation of ByteArrayOutputStream. It&amp;quot;s not synchronized, and it&lt;br /&gt;
 * does not copy buffers when it&amp;quot;s expanded. There&amp;quot;s also no copying of the internal buffer&lt;br /&gt;
 * if it&amp;quot;s contents is extracted with the writeTo(stream) method.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Rickard ?berg&lt;br /&gt;
 * @author Brat Baker (Atlassian)&lt;br /&gt;
 * @author Alexey&lt;br /&gt;
 * @version $Date: 2008-01-19 10:09:56 +0800 (Sat, 19 Jan 2008) $ $Id: FastByteArrayOutputStream.java 3000 2008-01-19 02:09:56Z tm_jee $&lt;br /&gt;
 */&lt;br /&gt;
public class FastByteArrayOutputStream extends OutputStream {&lt;br /&gt;
    // Static --------------------------------------------------------&lt;br /&gt;
    private static final int DEFAULT_BLOCK_SIZE = 8192;&lt;br /&gt;
&lt;br /&gt;
    private LinkedList buffers;&lt;br /&gt;
    // Attributes ----------------------------------------------------&lt;br /&gt;
    // internal buffer&lt;br /&gt;
    private byte[] buffer;&lt;br /&gt;
    // is the stream closed?&lt;br /&gt;
    private boolean closed;&lt;br /&gt;
    private int blockSize;&lt;br /&gt;
    private int index;&lt;br /&gt;
    private int size;&lt;br /&gt;
&lt;br /&gt;
    // Constructors --------------------------------------------------&lt;br /&gt;
    public FastByteArrayOutputStream() {&lt;br /&gt;
        this(DEFAULT_BLOCK_SIZE);&lt;br /&gt;
    }&lt;br /&gt;
    public FastByteArrayOutputStream(int aSize) {&lt;br /&gt;
        blockSize = aSize;&lt;br /&gt;
        buffer = new byte[blockSize];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getSize() {&lt;br /&gt;
        return size + index;&lt;br /&gt;
    }&lt;br /&gt;
    public void close() {&lt;br /&gt;
        closed = true;&lt;br /&gt;
    }&lt;br /&gt;
    public byte[] toByteArray() {&lt;br /&gt;
        byte[] data = new byte[getSize()];&lt;br /&gt;
        // Check if we have a list of buffers&lt;br /&gt;
        int pos = 0;&lt;br /&gt;
        if (buffers != null) {&lt;br /&gt;
            Iterator iter = buffers.iterator();&lt;br /&gt;
            while (iter.hasNext()) {&lt;br /&gt;
                byte[] bytes = (byte[]) iter.next();&lt;br /&gt;
                System.arraycopy(bytes, 0, data, pos, blockSize);&lt;br /&gt;
                pos += blockSize;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // write the internal buffer directly&lt;br /&gt;
        System.arraycopy(buffer, 0, data, pos, index);&lt;br /&gt;
        return data;&lt;br /&gt;
    }&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        return new String(toByteArray());&lt;br /&gt;
    }&lt;br /&gt;
    // OutputStream overrides ----------------------------------------&lt;br /&gt;
    public void write(int datum) throws IOException {&lt;br /&gt;
        if (closed) {&lt;br /&gt;
            throw new IOException(&amp;quot;Stream closed&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            if (index == blockSize) {&lt;br /&gt;
                addBuffer();&lt;br /&gt;
            }&lt;br /&gt;
            // store the byte&lt;br /&gt;
            buffer[index++] = (byte) datum;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void write(byte[] data, int offset, int length) throws IOException {&lt;br /&gt;
        if (data == null) {&lt;br /&gt;
            throw new NullPointerException();&lt;br /&gt;
        } else if ((offset &amp;lt; 0) || ((offset + length) &amp;gt; data.length) || (length &amp;lt; 0)) {&lt;br /&gt;
            throw new IndexOutOfBoundsException();&lt;br /&gt;
        } else if (closed) {&lt;br /&gt;
            throw new IOException(&amp;quot;Stream closed&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            if ((index + length) &amp;gt; blockSize) {&lt;br /&gt;
                int copyLength;&lt;br /&gt;
                do {&lt;br /&gt;
                    if (index == blockSize) {&lt;br /&gt;
                        addBuffer();&lt;br /&gt;
                    }&lt;br /&gt;
                    copyLength = blockSize - index;&lt;br /&gt;
                    if (length &amp;lt; copyLength) {&lt;br /&gt;
                        copyLength = length;&lt;br /&gt;
                    }&lt;br /&gt;
                    System.arraycopy(data, offset, buffer, index, copyLength);&lt;br /&gt;
                    offset += copyLength;&lt;br /&gt;
                    index += copyLength;&lt;br /&gt;
                    length -= copyLength;&lt;br /&gt;
                } while (length &amp;gt; 0);&lt;br /&gt;
            } else {&lt;br /&gt;
                // Copy in the subarray&lt;br /&gt;
                System.arraycopy(data, offset, buffer, index, length);&lt;br /&gt;
                index += length;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Public&lt;br /&gt;
    public void writeTo(OutputStream out) throws IOException {&lt;br /&gt;
        // Check if we have a list of buffers&lt;br /&gt;
        if (buffers != null) {&lt;br /&gt;
            Iterator iter = buffers.iterator();&lt;br /&gt;
            while (iter.hasNext()) {&lt;br /&gt;
                byte[] bytes = (byte[]) iter.next();&lt;br /&gt;
                out.write(bytes, 0, blockSize);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // write the internal buffer directly&lt;br /&gt;
        out.write(buffer, 0, index);&lt;br /&gt;
    }&lt;br /&gt;
    public void writeTo(RandomAccessFile out) throws IOException {&lt;br /&gt;
        // Check if we have a list of buffers&lt;br /&gt;
        if (buffers != null) {&lt;br /&gt;
            Iterator iter = buffers.iterator();&lt;br /&gt;
            while (iter.hasNext()) {&lt;br /&gt;
                byte[] bytes = (byte[]) iter.next();&lt;br /&gt;
                out.write(bytes, 0, blockSize);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // write the internal buffer directly&lt;br /&gt;
        out.write(buffer, 0, index);&lt;br /&gt;
    }&lt;br /&gt;
    public void writeTo(Writer out, String encoding) throws IOException {&lt;br /&gt;
        /*&lt;br /&gt;
          There is design tradeoff between being fast, correct and using too much memory when decoding bytes to strings.&lt;br /&gt;
         The rules are thus :&lt;br /&gt;
         1. if there is only one buffer then its a simple String conversion&lt;br /&gt;
              REASON : Fast!!!&lt;br /&gt;
         2. uses full buffer allocation annd System.arrayCopy() to smooosh together the bytes&lt;br /&gt;
              and then use String conversion&lt;br /&gt;
              REASON : Fast at the expense of a known amount of memory (eg the used memory * 2)&lt;br /&gt;
        */&lt;br /&gt;
        if (buffers != null)&lt;br /&gt;
        {&lt;br /&gt;
            // RULE 2 : a balance between using some memory and speed&lt;br /&gt;
            writeToViaSmoosh(out, encoding);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // RULE 1 : fastest!&lt;br /&gt;
            writeToViaString(out, encoding);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * This can &amp;lt;b&amp;gt;ONLY&amp;lt;/b&amp;gt; be called if there is only a single buffer to write, instead&lt;br /&gt;
     * use {@link #writeTo(java.io.Writer, String)}, which auto detects if&lt;br /&gt;
     * {@link #writeToViaString(java.io.Writer, String)} is to be used or&lt;br /&gt;
     * {@link #writeToViaSmoosh(java.io.Writer, String)}.&lt;br /&gt;
     *&lt;br /&gt;
     * @param out      the JspWriter&lt;br /&gt;
     * @param encoding the encoding&lt;br /&gt;
     * @throws IOException&lt;br /&gt;
     */&lt;br /&gt;
    void writeToViaString(Writer out, String encoding) throws IOException&lt;br /&gt;
    {&lt;br /&gt;
        byte[] bufferToWrite = buffer; // this is always the last buffer to write&lt;br /&gt;
        int bufferToWriteLen = index;  // index points to our place in the last buffer&lt;br /&gt;
        writeToImpl(out, encoding, bufferToWrite, bufferToWriteLen);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * This is recommended to be used where there&amp;quot;s more than 1 buffer to write, instead&lt;br /&gt;
     * use {@link #writeTo(java.io.Writer, String)} which auto detects if&lt;br /&gt;
     * {@link #writeToViaString(java.io.Writer, String)} is to be used or&lt;br /&gt;
     * {@link #writeToViaSmoosh(java.io.Writer, String)}.&lt;br /&gt;
     * &lt;br /&gt;
     * @param out&lt;br /&gt;
     * @param encoding&lt;br /&gt;
     * @throws IOException&lt;br /&gt;
     */&lt;br /&gt;
    void writeToViaSmoosh(Writer out, String encoding) throws IOException&lt;br /&gt;
    {&lt;br /&gt;
        byte[] bufferToWrite = toByteArray();&lt;br /&gt;
        int bufferToWriteLen = bufferToWrite.length;&lt;br /&gt;
        writeToImpl(out, encoding, bufferToWrite, bufferToWriteLen);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Write &amp;lt;code&amp;gt;bufferToWriteLen&amp;lt;/code&amp;gt; of bytes from &amp;lt;code&amp;gt;bufferToWrite&amp;lt;/code&amp;gt; to&lt;br /&gt;
     * &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt; encoding it at the same time.&lt;br /&gt;
     * &lt;br /&gt;
     * @param out&lt;br /&gt;
     * @param encoding&lt;br /&gt;
     * @param bufferToWrite&lt;br /&gt;
     * @param bufferToWriteLen&lt;br /&gt;
     * @throws IOException&lt;br /&gt;
     */&lt;br /&gt;
    private void writeToImpl(Writer out, String encoding, byte[] bufferToWrite, int bufferToWriteLen)&lt;br /&gt;
            throws IOException&lt;br /&gt;
    {&lt;br /&gt;
        String writeStr;&lt;br /&gt;
        if (encoding != null)&lt;br /&gt;
        {&lt;br /&gt;
            writeStr = new String(bufferToWrite, 0, bufferToWriteLen, encoding);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            writeStr = new String(bufferToWrite, 0, bufferToWriteLen);&lt;br /&gt;
        }&lt;br /&gt;
        out.write(writeStr);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Create a new buffer and store the&lt;br /&gt;
     * current one in linked list&lt;br /&gt;
     */&lt;br /&gt;
    protected void addBuffer() {&lt;br /&gt;
        if (buffers == null) {&lt;br /&gt;
            buffers = new LinkedList();&lt;br /&gt;
        }&lt;br /&gt;
        buffers.addLast(buffer);&lt;br /&gt;
        buffer = new byte[blockSize];&lt;br /&gt;
        size += index;&lt;br /&gt;
        index = 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.servlet.jsp.JspWriter;&lt;br /&gt;
/**&lt;br /&gt;
 * A test class for {@link webwork.util.FastByteArrayOutputStream}&lt;br /&gt;
 *&lt;br /&gt;
 * @author Brad Baker (Atlassian)&lt;br /&gt;
 * @since $Date$ $Id$&lt;br /&gt;
 */&lt;br /&gt;
public class FastByteArrayOutputStreamTestCase extends AbstractEncodingTestCase&lt;br /&gt;
{&lt;br /&gt;
    public void testLatinCharsets() throws Exception&lt;br /&gt;
    {&lt;br /&gt;
        assertEncoding(ASCII_TEXT, LATIN);&lt;br /&gt;
        assertEncoding(ASCII_TEXT, ASCII);&lt;br /&gt;
    }&lt;br /&gt;
    public void testRussianCharsets() throws Exception&lt;br /&gt;
    {&lt;br /&gt;
        assertEncoding(RUSSIAN_DESC_SHORT, KOI8_R);&lt;br /&gt;
        assertEncoding(RUSSIAN_DESC1, KOI8_R);&lt;br /&gt;
        assertEncoding(RUSSIAN_DESC_SHORT, WINDOWS_CYRILLIC);&lt;br /&gt;
        assertEncoding(RUSSIAN_DESC1, WINDOWS_CYRILLIC);&lt;br /&gt;
    }&lt;br /&gt;
    public void testUnicodeCharsets() throws Exception&lt;br /&gt;
    {&lt;br /&gt;
        String[] testStrs = {ASCII_TEXT_SHORT, ASCII_TEXT, RUSSIAN_DESC_SHORT, RUSSIAN_DESC1, CHINESE_TIMETRACKING, HUNGRIAN_APPLET_PROBLEM, };&lt;br /&gt;
        String[] encodings = { UTF_8, UTF_16, UBIG_ENDIAN, ULITTLE_ENDIAN, UBIG_ENDIAN_UNMARKED, ULITTLE_ENDIAN_UNMARKED };&lt;br /&gt;
        assertEncodings(testStrs, encodings);&lt;br /&gt;
    }&lt;br /&gt;
    protected void implementEncodingTest(final String srcStr, final String encoding, final int bufferSize)&lt;br /&gt;
            throws Exception&lt;br /&gt;
    {&lt;br /&gt;
        FastByteArrayOutputStream bout = new FastByteArrayOutputStream(bufferSize);&lt;br /&gt;
        byte[] bytes = srcStr.getBytes(encoding);&lt;br /&gt;
        bout.write(bytes);&lt;br /&gt;
        JspWriter writer = new StringCapturingJspWriter();&lt;br /&gt;
        bout.writeTo(writer, encoding);&lt;br /&gt;
        String actualStr = writer.toString();&lt;br /&gt;
        String expectedStr = new String(bytes, encoding);&lt;br /&gt;
        assertTheyAreEqual(expectedStr, actualStr, encoding);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Before it was changed to use {@link java.nio.charset.CharsetDecoder} is took an this time&lt;br /&gt;
     * &amp;lt;p/&amp;gt;&lt;br /&gt;
     * Total Call Time = 1112.0ms&lt;br /&gt;
     * Average Call Time = 0.001112ms&lt;br /&gt;
     * &amp;lt;p/&amp;gt;&lt;br /&gt;
     * Now with the change it takes this time&lt;br /&gt;
     * &amp;lt;p/&amp;gt;&lt;br /&gt;
     * &amp;lt;p/&amp;gt;&lt;br /&gt;
     * The idea is that it did not get significantly worse in performance&lt;br /&gt;
     *&lt;br /&gt;
     * @throws IOException&lt;br /&gt;
     */&lt;br /&gt;
    public void testPerformanceOfWriteToJspWriter() throws IOException&lt;br /&gt;
    {&lt;br /&gt;
        final String NINEK_STR = makeRoughly(ASCII, 9 * K);&lt;br /&gt;
        final String FIFTYK_STR = makeRoughly(ASCII, 50 * K);&lt;br /&gt;
        final String ONEHUNDREDK_STR = makeRoughly(ASCII, 100 * K);&lt;br /&gt;
        testPerformanceOfWriteToJspWriter(new TextSource()&lt;br /&gt;
        {&lt;br /&gt;
            public String getDesc()&lt;br /&gt;
            {&lt;br /&gt;
                return &amp;quot;With &amp;lt; than 8K of data&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            public String getText(final int times)&lt;br /&gt;
            {&lt;br /&gt;
                return ASCII_TEXT;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        testPerformanceOfWriteToJspWriter(new TextSource()&lt;br /&gt;
        {&lt;br /&gt;
            public String getDesc()&lt;br /&gt;
            {&lt;br /&gt;
                return &amp;quot;With &amp;gt; than 8K of data&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            public String getText(final int times)&lt;br /&gt;
            {&lt;br /&gt;
                return NINEK_STR;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        testPerformanceOfWriteToJspWriter(new TextSource()&lt;br /&gt;
        {&lt;br /&gt;
            public String getDesc()&lt;br /&gt;
            {&lt;br /&gt;
                return &amp;quot;With a 2/3 mix of small data and 1/3 &amp;gt; 8K of data&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            public String getText(final int times)&lt;br /&gt;
            {&lt;br /&gt;
                if (times % 3 == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    return NINEK_STR;&lt;br /&gt;
                }&lt;br /&gt;
                return ASCII_TEXT;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        testPerformanceOfWriteToJspWriter(new TextSource()&lt;br /&gt;
        {&lt;br /&gt;
            public String getDesc()&lt;br /&gt;
            {&lt;br /&gt;
                return &amp;quot;With a 1/2 mix of small data and 1/2 &amp;gt; 8K of data&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            public String getText(final int times)&lt;br /&gt;
            {&lt;br /&gt;
                if (times % 2 == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    return NINEK_STR;&lt;br /&gt;
                }&lt;br /&gt;
                return ASCII_TEXT;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        testPerformanceOfWriteToJspWriter(new TextSource()&lt;br /&gt;
        {&lt;br /&gt;
            public String getDesc()&lt;br /&gt;
            {&lt;br /&gt;
                return &amp;quot;With 50K of data&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            public String getText(final int times)&lt;br /&gt;
            {&lt;br /&gt;
                return FIFTYK_STR;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        testPerformanceOfWriteToJspWriter(new TextSource()&lt;br /&gt;
        {&lt;br /&gt;
            public String getDesc()&lt;br /&gt;
            {&lt;br /&gt;
                return &amp;quot;With 100K of data&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            public String getText(final int times)&lt;br /&gt;
            {&lt;br /&gt;
                return ONEHUNDREDK_STR;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void testPerformanceOfWriteToJspWriter(TextSource textSource) throws IOException&lt;br /&gt;
    {&lt;br /&gt;
        NoopJspWriter noopJspWriter = new NoopJspWriter();&lt;br /&gt;
        String[] methods = {&lt;br /&gt;
                &amp;quot;writeTo (using hueristics)&amp;quot;,&lt;br /&gt;
                &amp;quot;writeToViaSmoosh&amp;quot;,&lt;br /&gt;
        };&lt;br /&gt;
        System.out.println(textSource.getDesc());&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        float bestTime = Float.MAX_VALUE;&lt;br /&gt;
        String bestMethod = methods[0];&lt;br /&gt;
        for (int methodIndex = 0; methodIndex &amp;lt; methods.length; methodIndex++)&lt;br /&gt;
        {&lt;br /&gt;
            String method = methods[methodIndex];&lt;br /&gt;
            float totalTime = 0;&lt;br /&gt;
            final int MAX_TIMES = 10;&lt;br /&gt;
            final int MAX_ITERATIONS = 100;&lt;br /&gt;
            for (int times = 0; times &amp;lt; MAX_TIMES; times++)&lt;br /&gt;
            {&lt;br /&gt;
                String srcText = textSource.getText(times);&lt;br /&gt;
                for (int i = 0; i &amp;lt; MAX_ITERATIONS; i++)&lt;br /&gt;
                {&lt;br /&gt;
                    FastByteArrayOutputStream bout = new FastByteArrayOutputStream();&lt;br /&gt;
                    bout.write(srcText.getBytes(UTF_8));&lt;br /&gt;
                    // just time the JspWriter output. And let it warm u first as well&lt;br /&gt;
                    if (times &amp;gt; 3)&lt;br /&gt;
                    {&lt;br /&gt;
                        long then = System.currentTimeMillis();&lt;br /&gt;
                        switch (methodIndex)&lt;br /&gt;
                        {&lt;br /&gt;
                            case 0:&lt;br /&gt;
                                bout.writeTo(noopJspWriter, UTF_8);&lt;br /&gt;
                                break;&lt;br /&gt;
                            case 1:&lt;br /&gt;
                                bout.writeToViaSmoosh(noopJspWriter, UTF_8);&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        long now = System.currentTimeMillis();&lt;br /&gt;
                        totalTime += (now - then);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            float avgTime = totalTime / MAX_TIMES / MAX_ITERATIONS;&lt;br /&gt;
            System.out.println(method + &amp;quot;  - Total Call Time = &amp;quot; + totalTime + &amp;quot;ms&amp;quot;);&lt;br /&gt;
            System.out.println(method + &amp;quot; - Average Call Time = &amp;quot; + avgTime + &amp;quot;ms&amp;quot;);&lt;br /&gt;
            System.out.println();&lt;br /&gt;
            if (avgTime &amp;lt; bestTime) {&lt;br /&gt;
                bestTime = avgTime;&lt;br /&gt;
                bestMethod = method;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(bestMethod + &amp;quot; was the best method - Average Call Time = &amp;quot; + bestTime + &amp;quot;ms&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;____________________\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    interface TextSource&lt;br /&gt;
    {&lt;br /&gt;
        String getDesc();&lt;br /&gt;
        String getText(int times);&lt;br /&gt;
    }&lt;br /&gt;
    static class StringCapturingJspWriter extends NoopJspWriter&lt;br /&gt;
    {&lt;br /&gt;
        StringCapturingJspWriter()&lt;br /&gt;
        {&lt;br /&gt;
            super(true);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    static class NoopJspWriter extends JspWriter&lt;br /&gt;
    {&lt;br /&gt;
        final StringBuffer sb = new StringBuffer();&lt;br /&gt;
        final boolean capture;&lt;br /&gt;
        NoopJspWriter()&lt;br /&gt;
        {&lt;br /&gt;
            this(false);&lt;br /&gt;
        }&lt;br /&gt;
        NoopJspWriter(boolean capture)&lt;br /&gt;
        {&lt;br /&gt;
            super(0, false);&lt;br /&gt;
            this.capture = capture;&lt;br /&gt;
        }&lt;br /&gt;
        NoopJspWriter(final int i, final boolean b)&lt;br /&gt;
        {&lt;br /&gt;
            super(i, b);&lt;br /&gt;
            this.capture = false;&lt;br /&gt;
        }&lt;br /&gt;
        public String toString()&lt;br /&gt;
        {&lt;br /&gt;
            return sb.toString();&lt;br /&gt;
        }&lt;br /&gt;
        public void clear() throws IOException&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        public void clearBuffer() throws IOException&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        public void close() throws IOException&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        public void flush() throws IOException&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        public int getRemaining()&lt;br /&gt;
        {&lt;br /&gt;
            return 0;&lt;br /&gt;
        }&lt;br /&gt;
        public void newLine() throws IOException&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final char c) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(c);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final double v) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(v);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final float v) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(v);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final int i) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(i);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final long l) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(l);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final Object o) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(o);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final String s) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(s);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final boolean b) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(b);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void print(final char[] chars) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            if (capture)&lt;br /&gt;
            {&lt;br /&gt;
                sb.append(chars);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        public void println() throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final char c) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(c);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final double v) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(v);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final float v) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(v);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final int i) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(i);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final long l) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(l);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final Object o) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(o);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final String s) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(s);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final boolean b) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(b);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void println(final char[] chars) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            print(chars);&lt;br /&gt;
            println();&lt;br /&gt;
        }&lt;br /&gt;
        public void write(final char cbuf[], final int off, final int len) throws IOException&lt;br /&gt;
        {&lt;br /&gt;
            String s = new String(cbuf, off, len);&lt;br /&gt;
            print(s);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  ByteArrayOutputStream Demo ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.ByteArrayInputStream;&lt;br /&gt;
import java.io.ByteArrayOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
public class ByteArrayIOApp {&lt;br /&gt;
  public static void main(String args[]) throws IOException {&lt;br /&gt;
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();&lt;br /&gt;
    String s = &amp;quot;This is a test.&amp;quot;;&lt;br /&gt;
    for (int i = 0; i &amp;lt; s.length(); ++i)&lt;br /&gt;
      outStream.write(s.charAt(i));&lt;br /&gt;
    System.out.println(&amp;quot;outstream: &amp;quot; + outStream);&lt;br /&gt;
    System.out.println(&amp;quot;size: &amp;quot; + outStream.size());&lt;br /&gt;
    ByteArrayInputStream inStream;&lt;br /&gt;
    inStream = new ByteArrayInputStream(outStream.toByteArray());&lt;br /&gt;
    int inBytes = inStream.available();&lt;br /&gt;
    System.out.println(&amp;quot;inStream has &amp;quot; + inBytes + &amp;quot; available bytes&amp;quot;);&lt;br /&gt;
    byte inBuf[] = new byte[inBytes];&lt;br /&gt;
    int bytesRead = inStream.read(inBuf, 0, inBytes);&lt;br /&gt;
    System.out.println(bytesRead + &amp;quot; bytes were read&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;They are: &amp;quot; + new String(inBuf));&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>