diff --git a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java deleted file mode 100644 index d753e79ab..000000000 --- a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java +++ /dev/null @@ -1,509 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.redkale.convert.json; - -import java.nio.ByteBuffer; -import org.redkale.util.Utility; - -/** - * - * writeTo系列的方法输出的字符不能含特殊字符 - *

- * 详情见: https://redkale.org - * - * @author zhangjx - * - * @since 2.3.0 - * - * @deprecated 2.5.0 JDK9以上用byte[]代替char[]会有更好的性能 - */ -@Deprecated(since = "2.5.0") -public class JsonCharsWriter extends JsonWriter { - - private static final char[] CHARS_TUREVALUE = "true".toCharArray(); - - private static final char[] CHARS_FALSEVALUE = "false".toCharArray(); - - private static final int TENTHOUSAND_MAX = 10001; - - private static final char[][] TENTHOUSAND_BYTES = new char[TENTHOUSAND_MAX][]; - - static { - for (int i = 0; i < TENTHOUSAND_BYTES.length; i++) { - TENTHOUSAND_BYTES[i] = String.valueOf(i).toCharArray(); - } - } - - private int count; - - private char[] content; - - public JsonCharsWriter() { - this(defaultSize); - } - - public JsonCharsWriter(int size) { - this.content = new char[size > 1024 ? size : 1024]; - } - - //----------------------------------------------------------------------- - /** - * 返回指定至少指定长度的缓冲区 - * - * @param len - * - * @return - */ - private char[] expand(int len) { - int newcount = count + len; - if (newcount <= content.length) { - return content; - } - char[] newdata = new char[Math.max(content.length * 3 / 2, newcount)]; - System.arraycopy(content, 0, newdata, 0, count); - this.content = newdata; - return newdata; - } - - @Override - public void writeTo(final char ch) { //只能是 0 - 127 的字符 - expand(1); - content[count++] = ch; - } - - @Override - public void writeTo(final char[] chs, final int start, final int len) { //只能是 0 - 127 的字符 - expand(len); - System.arraycopy(chs, start, content, count, len); - count += len; - } - - @Override - public void writeTo(final byte ch) { //只能是 0 - 127 的字符 - expand(1); - content[count++] = (char) ch; - } - - @Override - public void writeTo(final byte[] chs, final int start, final int len) { //只能是 0 - 127 的字符 - expand(len); - for (int i = 0; i < len; i++) { - content[count + i] = (char) chs[start + i]; - } - count += len; - } - - /** - * 注意: 该String值不能为null且不会进行转义, 只用于不含需要转义字符的字符串,例如enum、double、BigInteger、BigDecimal转换的String - * - * @param quote 是否加双引号 - * @param value 非null且不含需要转义的字符的String值 - */ - @Override - public void writeLatin1To(final boolean quote, final String value) { - if (value == null) { - writeNull(); - return; - } - int len = value.length(); - expand(len + (quote ? 2 : 0)); - if (quote) { - content[count++] = '"'; - } - value.getChars(0, len, content, count); - count += len; - if (quote) { - content[count++] = '"'; - } - } - - @Override - public void writeFieldShortValue(final byte[] fieldBytes, final short value) { - String val = String.valueOf(value); - int len1 = fieldBytes.length; - int len2 = val.length(); - expand(len1 + len2); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - val.getChars(0, len2, content, count); - count += len2; - } - - @Override - public void writeFieldIntValue(final byte[] fieldBytes, final int value) { - String val = String.valueOf(value); - int len1 = fieldBytes.length; - int len2 = val.length(); - expand(len1 + len2); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - val.getChars(0, len2, content, count); - count += len2; - } - - @Override - public void writeFieldLongValue(final byte[] fieldBytes, final long value) { - String val = String.valueOf(value); - int len1 = fieldBytes.length; - int len2 = val.length(); - expand(len1 + len2); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - val.getChars(0, len2, content, count); - count += len2; - } - - @Override - public void writeFieldLatin1Value(final byte[] fieldBytes, final String value) { - int len1 = fieldBytes.length; - int len2 = value.length(); - expand(len1 + len2 + 2); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - content[count++] = '"'; - value.getChars(0, len2, content, count); - count += len2; - content[count++] = '"'; - } - - @Override - public void writeLastFieldShortValue(final byte[] fieldBytes, final short value) { - String val = String.valueOf(value); - int len1 = fieldBytes.length; - int len2 = val.length(); - expand(len1 + len2 + 1); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - val.getChars(0, len2, content, count); - count += len2; - content[count++] = '}'; - } - - @Override - public void writeLastFieldIntValue(final byte[] fieldBytes, final int value) { - String val = String.valueOf(value); - int len1 = fieldBytes.length; - int len2 = val.length(); - expand(len1 + len2 + 1); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - val.getChars(0, len2, content, count); - count += len2; - content[count++] = '}'; - } - - @Override - public void writeLastFieldLongValue(final byte[] fieldBytes, final long value) { - String val = String.valueOf(value); - int len1 = fieldBytes.length; - int len2 = val.length(); - expand(len1 + len2 + 1); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - val.getChars(0, len2, content, count); - count += len2; - content[count++] = '}'; - } - - @Override - public void writeLastFieldLatin1Value(final byte[] fieldBytes, final String value) { - if (value == null && nullable()) { - writeTo(fieldBytes); - writeNull(); - writeTo('}'); - return; - } - if (value == null || (tiny && value.isEmpty())) { - expand(1); - content[count++] = '}'; - } else { - int len1 = fieldBytes.length; - int len2 = value.length(); - expand(len1 + len2 + 3); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - content[count++] = '"'; - value.getChars(0, len2, content, count); - count += len2; - content[count++] = '"'; - content[count++] = '}'; - } - } - - @Override //firstFieldBytes 必须带{开头 - public void writeObjectByOnlyOneLatin1FieldValue(final byte[] firstFieldBytes, final String value) { - if (value == null && nullable()) { - writeTo('{'); - writeTo(firstFieldBytes); - writeNull(); - writeTo('}'); - return; - } - if (value == null || (tiny && value.isEmpty())) { - expand(2); - content[count++] = '{'; - content[count++] = '}'; - } else { - byte[] fieldBytes = firstFieldBytes; - int len1 = fieldBytes.length; - int len2 = value.length(); - expand(len1 + len2 + 3); - for (int i = 0; i < len1; i++) { - content[count + i] = (char) fieldBytes[i]; - } - count += len1; - content[count++] = '"'; - value.getChars(0, len2, content, count); - count += len2; - content[count++] = '"'; - content[count++] = '}'; - } - } - - @Override //firstFieldBytes 必须带{开头, lastFieldBytes必须,开头 - public void writeObjectByOnlyTwoIntFieldValue(final byte[] firstFieldBytes, final int value1, final byte[] lastFieldBytes, final int value2) { - String val1 = String.valueOf(value1); - String val2 = String.valueOf(value2); - int len1 = firstFieldBytes.length; - int len2 = val1.length(); - int len3 = lastFieldBytes.length; - int len4 = val2.length(); - expand(len1 + len2 + len3 + len4 + 1); - - for (int i = 0; i < len1; i++) { - content[count + i] = (char) firstFieldBytes[i]; - } - count += len1; - val1.getChars(0, len2, content, count); - count += len2; - - for (int i = 0; i < len3; i++) { - content[count + i] = (char) lastFieldBytes[i]; - } - count += len3; - val2.getChars(0, len4, content, count); - count += len4; - - content[count++] = '}'; - } - - @Override - protected boolean recycle() { - super.recycle(); - this.count = 0; - this.specificObjectType = null; - if (this.content != null && this.content.length > defaultSize) { - this.content = new char[defaultSize]; - } - return true; - } - - public ByteBuffer[] toBuffers() { - return new ByteBuffer[]{ByteBuffer.wrap(Utility.encodeUTF8(content, 0, count))}; - } - - public byte[] toBytes() { - return Utility.encodeUTF8(content, 0, count); - } - - public int count() { - return this.count; - } - - @Override - public void writeString(String value) { - writeString(true, value); - } - - @Override - public void writeString(final boolean quote, String value) { - if (value == null) { - writeNull(); - return; - } - expand(value.length() * 2 + 2); - if (quote) { - content[count++] = '"'; - } - for (char ch : Utility.charArray(value)) { - switch (ch) { - case '\n': - content[count++] = '\\'; - content[count++] = 'n'; - break; - case '\r': - content[count++] = '\\'; - content[count++] = 'r'; - break; - case '\t': - content[count++] = '\\'; - content[count++] = 't'; - break; - case '\\': - content[count++] = '\\'; - content[count++] = ch; - break; - case '"': - content[count++] = '\\'; - content[count++] = ch; - break; - default: - content[count++] = ch; - break; - } - } - if (quote) { - content[count++] = '"'; - } - } - - @Override - public String toString() { - return new String(content, 0, count); - } - - //---------------------------------------------------------------------------------------------- - @Override - public void writeBoolean(boolean value) { - writeTo(value ? CHARS_TUREVALUE : CHARS_FALSEVALUE); - } - - @Override - public void writeInt(int value) { - if (value >= 0 && value < TENTHOUSAND_MAX) { - writeTo(TENTHOUSAND_BYTES[value]); - return; - } - final char sign = value >= 0 ? 0 : '-'; - if (value < 0) { - value = -value; - } - int size; - for (int i = 0;; i++) { - if (value <= sizeTable[i]) { - size = i + 1; - break; - } - } - if (sign != 0) { - size++; //负数 - } - expand(size); - - int q, r; - int charPos = count + size; - - // Generate two digits per iteration - while (value >= 65536) { - q = value / 100; - // really: r = i - (q * 100); - r = value - ((q << 6) + (q << 5) + (q << 2)); - value = q; - content[--charPos] = DigitOnes[r]; - content[--charPos] = DigitTens[r]; - } - - // Fall thru to fast mode for smaller numbers - // assert(i <= 65536, i); - for (;;) { - q = (value * 52429) >>> (16 + 3); - r = value - ((q << 3) + (q << 1)); // r = i-(q*10) ... - content[--charPos] = digits[r]; - value = q; - if (value == 0) { - break; - } - } - if (sign != 0) { - content[--charPos] = sign; - } - count += size; - } - - @Override - public void writeLong(long value) { - if (value >= 0 && value < TENTHOUSAND_MAX) { - writeTo(TENTHOUSAND_BYTES[(int) value]); - return; - } - final char sign = value >= 0 ? 0 : '-'; - if (value < 0) { - value = -value; - } - int size = 19; - long p = 10; - for (int i = 1; i < 19; i++) { - if (value < p) { - size = i; - break; - } - p = 10 * p; - } - if (sign != 0) { - size++; //负数 - } - expand(size); - - long q; - int r; - int charPos = count + size; - - // Get 2 digits/iteration using longs until quotient fits into an int - while (value > Integer.MAX_VALUE) { - q = value / 100; - // really: r = i - (q * 100); - r = (int) (value - ((q << 6) + (q << 5) + (q << 2))); - value = q; - content[--charPos] = DigitOnes[r]; - content[--charPos] = DigitTens[r]; - } - - // Get 2 digits/iteration using ints - int q2; - int i2 = (int) value; - while (i2 >= 65536) { - q2 = i2 / 100; - // really: r = i2 - (q * 100); - r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2)); - i2 = q2; - content[--charPos] = DigitOnes[r]; - content[--charPos] = DigitTens[r]; - } - - // Fall thru to fast mode for smaller numbers - // assert(i2 <= 65536, i2); - for (;;) { - q2 = (i2 * 52429) >>> (16 + 3); - r = i2 - ((q2 << 3) + (q2 << 1)); // r = i2-(q2*10) ... - content[--charPos] = digits[r]; - i2 = q2; - if (i2 == 0) { - break; - } - } - if (sign != 0) { - content[--charPos] = sign; - } - count += size; - } - -}