aboutsummaryrefslogtreecommitdiff
path: root/gson/src/main/java/com/google/gson/internal/Streams.java
diff options
context:
space:
mode:
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.java46
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;
+ }
}
}
-
}