diff options
Diffstat (limited to 'gson/src/main/java/com/google/gson/internal/Streams.java')
-rw-r--r-- | gson/src/main/java/com/google/gson/internal/Streams.java | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/gson/src/main/java/com/google/gson/internal/Streams.java b/gson/src/main/java/com/google/gson/internal/Streams.java index 0bb73aa1..eafbbbec 100644 --- a/gson/src/main/java/com/google/gson/internal/Streams.java +++ b/gson/src/main/java/com/google/gson/internal/Streams.java @@ -28,6 +28,7 @@ import com.google.gson.stream.MalformedJsonException; import java.io.EOFException; import java.io.IOException; import java.io.Writer; +import java.util.Objects; /** * Reads and writes GSON parse trees over streams. @@ -89,22 +90,48 @@ public final class Streams { } @Override public void write(char[] chars, int offset, int length) throws IOException { - currentWrite.chars = chars; + currentWrite.setChars(chars); appendable.append(currentWrite, offset, offset + length); } + @Override public void flush() {} + @Override public void close() {} + + // Override these methods for better performance + // They would otherwise unnecessarily create Strings or char arrays + @Override public void write(int i) throws IOException { appendable.append((char) i); } - @Override public void flush() {} - @Override public void close() {} + @Override public void write(String str, int off, int len) throws IOException { + // Appendable.append turns null -> "null", which is not desired here + Objects.requireNonNull(str); + appendable.append(str, off, off + len); + } + + @Override public Writer append(CharSequence csq) throws IOException { + appendable.append(csq); + return this; + } + + @Override public Writer append(CharSequence csq, int start, int end) throws IOException { + appendable.append(csq, start, end); + return this; + } /** * A mutable char sequence pointing at a single char[]. */ - static class CurrentWrite implements CharSequence { - char[] chars; + private static class CurrentWrite implements CharSequence { + private char[] chars; + private String cachedString; + + void setChars(char[] chars) { + this.chars = chars; + this.cachedString = null; + } + @Override public int length() { return chars.length; } @@ -114,7 +141,14 @@ public final class Streams { @Override public CharSequence subSequence(int start, int end) { return new String(chars, start, end - start); } + + // Must return string representation to satisfy toString() contract + @Override public String toString() { + if (cachedString == null) { + cachedString = new String(chars); + } + return cachedString; + } } } - } |