[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jakarta-commons-dev
Subject:    [jira] [Created] (LANG-993) Add zero copy write methods to StrBuilder
From:       "Mikhail Mazursky (JIRA)" <jira () apache ! org>
Date:       2014-03-31 15:03:23
Message-ID: JIRA.12705674.1396278176090.36575.1396278203200 () arcas
[Download RAW message or body]

Mikhail Mazursky created LANG-993:
-------------------------------------

             Summary: Add zero copy write methods to StrBuilder
                 Key: LANG-993
                 URL: https://issues.apache.org/jira/browse/LANG-993
             Project: Commons Lang
          Issue Type: Improvement
          Components: lang.text.*
    Affects Versions: 3.3.1
            Reporter: Mikhail Mazursky


Currently I have the following usecase:

{code}
StrBuilder builder = new StrBuilder();
// add lots of stuff to builder
// in multiple invocations in several classes
// writer cannot be used directly
builder.append(...);

Writer writer = ....;
CharStreams.copy(builder.asReader(), writer);
{code}

[CharStreams|https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/io/CharStreams.java#177] \
is a class from Guava lib that copies data between reader and writer using temporary \
buffer. There is a problem with such approach - two additional copies are performed:
1) data is copied from the StrBuilder in chunks into temporary buffer (CharBuffer)
2) Writer.append(CharSequence) is called that is usually implemented as \
write(CharSequence.toString()) - i.e. it makes another copy of data and allocates an \
additional String object.

I want to avoid those copies by writing the internal buffer of the StrBuilder \
directly to the writer. Also it is potentially more efficient because it performs one \
I/O call instead of many.

So I propose to add the following methods:

{code}
    public void writeTo(Writer writer) throws IOException {
        writer.write(buffer, 0, size);
    }

    public void writeTo(StringBuilder builder) {
        builder.append(buffer, 0, size);
    }

    public void writeTo(StringBuffer buffer) {
        buffer.append(this.buffer, 0, size);
    }
{code}

If there is interest I will provide patch (with JavaDocs and tests).



--
This message was sent by Atlassian JIRA
(v6.2#6252)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic