aboutsummaryrefslogtreecommitdiff
path: root/common/unsafe
diff options
context:
space:
mode:
Diffstat (limited to 'common/unsafe')
-rw-r--r--common/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java20
1 files changed, 17 insertions, 3 deletions
diff --git a/common/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java b/common/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java
index 3800d53c02..87b9e8eb44 100644
--- a/common/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java
+++ b/common/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java
@@ -147,7 +147,13 @@ public final class UTF8String implements Comparable<UTF8String>, Externalizable,
buffer.position(pos + numBytes);
}
- public void writeTo(OutputStream out) throws IOException {
+ /**
+ * Returns a {@link ByteBuffer} wrapping the base object if it is a byte array
+ * or a copy of the data if the base object is not a byte array.
+ *
+ * Unlike getBytes this will not create a copy the array if this is a slice.
+ */
+ public @Nonnull ByteBuffer getByteBuffer() {
if (base instanceof byte[] && offset >= BYTE_ARRAY_OFFSET) {
final byte[] bytes = (byte[]) base;
@@ -160,12 +166,20 @@ public final class UTF8String implements Comparable<UTF8String>, Externalizable,
throw new ArrayIndexOutOfBoundsException();
}
- out.write(bytes, (int) arrayOffset, numBytes);
+ return ByteBuffer.wrap(bytes, (int) arrayOffset, numBytes);
} else {
- out.write(getBytes());
+ return ByteBuffer.wrap(getBytes());
}
}
+ public void writeTo(OutputStream out) throws IOException {
+ final ByteBuffer bb = this.getByteBuffer();
+ assert(bb.hasArray());
+
+ // similar to Utils.writeByteBuffer but without the spark-core dependency
+ out.write(bb.array(), bb.arrayOffset() + bb.position(), bb.remaining());
+ }
+
/**
* Returns the number of bytes for a code point with the first byte as `b`
* @param b The first byte of a code point