From 921f96c975ca60151d86a067a501dc29c517a713 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 27 Aug 2018 12:29:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96toBuffers=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/bson/BsonWriter.java | 1 + .../convert/json/JsonByteBufferWriter.java | 6 ++++- src/org/redkale/convert/json/JsonWriter.java | 6 +++-- src/org/redkale/net/Response.java | 3 ++- src/org/redkale/net/http/HttpResponse.java | 4 ++-- src/org/redkale/util/ByteBufferReader.java | 16 +++++++++++++ src/org/redkale/util/ByteBufferWriter.java | 23 +++++++------------ 7 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/org/redkale/convert/bson/BsonWriter.java b/src/org/redkale/convert/bson/BsonWriter.java index ad370f86d..3fcc028ba 100644 --- a/src/org/redkale/convert/bson/BsonWriter.java +++ b/src/org/redkale/convert/bson/BsonWriter.java @@ -39,6 +39,7 @@ public class BsonWriter extends Writer { } public ByteBuffer[] toBuffers(final Supplier supplier) { + if (supplier == null) return new ByteBuffer[]{ByteBuffer.wrap(content, 0, count)}; return ByteBufferWriter.create(supplier).put(content, 0, count).toBuffers(); } diff --git a/src/org/redkale/convert/json/JsonByteBufferWriter.java b/src/org/redkale/convert/json/JsonByteBufferWriter.java index 51c8e89be..8bf69b798 100644 --- a/src/org/redkale/convert/json/JsonByteBufferWriter.java +++ b/src/org/redkale/convert/json/JsonByteBufferWriter.java @@ -55,8 +55,12 @@ public class JsonByteBufferWriter extends JsonWriter { return false; } - @Override public ByteBuffer[] toBuffers() { + return toBuffers(supplier); + } + + @Override + public ByteBuffer[] toBuffers(Supplier supplier) { if (buffers == null) return new ByteBuffer[0]; for (int i = index; i < this.buffers.length; i++) { ByteBuffer buf = this.buffers[i]; diff --git a/src/org/redkale/convert/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index f15323ec6..527e1bb7d 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -6,6 +6,7 @@ package org.redkale.convert.json; import java.nio.ByteBuffer; +import java.util.function.Supplier; import org.redkale.convert.*; import org.redkale.util.*; @@ -106,8 +107,9 @@ public class JsonWriter extends Writer { return true; } - public ByteBuffer[] toBuffers() { - return new ByteBuffer[]{ByteBuffer.wrap(Utility.encodeUTF8(content, 0, count))}; + public ByteBuffer[] toBuffers(Supplier supplier) { + if (supplier == null) return new ByteBuffer[]{ByteBuffer.wrap(Utility.encodeUTF8(content, 0, count))}; + return ByteBufferWriter.create(supplier).put(Utility.encodeUTF8(content, 0, count)).toBuffers(); } public byte[] toBytes() { diff --git a/src/org/redkale/net/Response.java b/src/org/redkale/net/Response.java index f4e98c048..4ca82a3d0 100644 --- a/src/org/redkale/net/Response.java +++ b/src/org/redkale/net/Response.java @@ -10,6 +10,7 @@ import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.util.function.*; import java.util.logging.Level; +import org.redkale.util.ByteBufferWriter; /** * 协议响应对象 @@ -274,7 +275,7 @@ public abstract class Response> { buffer.flip(); this.finish(buffer); } else { - this.finish(ByteBuffer.wrap(bs)); + this.finish(ByteBufferWriter.toBuffers(this.context.getBufferSupplier(), bs)); } } diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 9d5b3acc6..075c75907 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -636,7 +636,7 @@ public class HttpResponse extends Response { super.finish(false, headbuf); } else { headbuf.flip(); - super.finish(false, new ByteBuffer[]{headbuf, ByteBuffer.wrap(content)}); + super.finish(false, Utility.append(new ByteBuffer[]{headbuf}, ByteBufferWriter.toBuffers(context.getBufferSupplier(), content))); } } else { if (this.context.getBufferCapacity() >= content.length) { @@ -645,7 +645,7 @@ public class HttpResponse extends Response { buffer.flip(); this.finish(false, buffer); } else { - this.finish(false, ByteBuffer.wrap(content)); + this.finish(false, ByteBufferWriter.toBuffers(context.getBufferSupplier(), content)); } } diff --git a/src/org/redkale/util/ByteBufferReader.java b/src/org/redkale/util/ByteBufferReader.java index e934fdd85..a91ffe5ad 100644 --- a/src/org/redkale/util/ByteBufferReader.java +++ b/src/org/redkale/util/ByteBufferReader.java @@ -63,6 +63,22 @@ public class ByteBufferReader { return new ByteBufferReader(buffers); } + public static byte[] toBytes(ByteBuffer[] buffers) { + if (buffers == null) return null; + int size = 0; + for (ByteBuffer buffer : buffers) { + size += buffer.remaining(); + } + byte[] bs = new byte[size]; + int index = 0; + for (ByteBuffer buffer : buffers) { + int remain = buffer.remaining(); + buffer.get(bs, index, remain); + index += remain; + } + return bs; + } + public boolean hasRemaining() { return this.currBuffer.hasRemaining(); } diff --git a/src/org/redkale/util/ByteBufferWriter.java b/src/org/redkale/util/ByteBufferWriter.java index 4e28ce4d8..ca90cf9ed 100644 --- a/src/org/redkale/util/ByteBufferWriter.java +++ b/src/org/redkale/util/ByteBufferWriter.java @@ -34,6 +34,14 @@ public class ByteBufferWriter { return new ByteBufferWriter(supplier); } + public static ByteBuffer[] toBuffers(Supplier supplier, byte[] content) { + return new ByteBufferWriter(supplier).put(content, 0, content.length).toBuffers(); + } + + public static ByteBuffer[] toBuffers(Supplier supplier, byte[] content, int offset, int length) { + return new ByteBufferWriter(supplier).put(content, offset, length).toBuffers(); + } + private ByteBuffer getLastBuffer(int size) { if (this.buffers == null) { ByteBuffer buf = supplier.get(); @@ -173,19 +181,4 @@ public class ByteBufferWriter { return this; } - public static byte[] toBytes(ByteBuffer[] buffers) { - if (buffers == null) return null; - int size = 0; - for (ByteBuffer buffer : buffers) { - size += buffer.remaining(); - } - byte[] bs = new byte[size]; - int index = 0; - for (ByteBuffer buffer : buffers) { - int remain = buffer.remaining(); - buffer.get(bs, index, remain); - index += remain; - } - return bs; - } }