public
abstract
class
ByteString
implements
Iterable<Byte>
,
Serializable
Immutable sequence of bytes. Provides conversions to and from byte[]
, java.lang.String
, ByteBuffer
, InputStream
, OutputStream
. Also provides a
conversion to CodedInputStream
.
Like String , the contents of a ByteString can never be observed to change, not even in the presence of a data race or incorrect API usage in the client code.
Substring is supported by sharing the reference to the immutable underlying bytes. Concatenation is likewise supported without copying (long strings) by building a tree of pieces in RopeByteString .
Static Fields
EMPTY
public
static
final
ByteString
EMPTY
Empty ByteString
.
Static Methods
copyFrom(byte[] bytes)
public
static
ByteString
copyFrom
(
byte
[]
bytes
)
Copies the given bytes into a ByteString
.
copyFrom(byte[] bytes, int offset, int size)
public
static
ByteString
copyFrom
(
byte
[]
bytes
,
int
offset
,
int
size
)
Copies the given bytes into a ByteString
.
copyFrom(Iterable<ByteString> byteStrings)
public
static
ByteString
copyFrom
(
Iterable<ByteString>
byteStrings
)
Concatenates all byte strings in the iterable and returns the result. This is designed to run in O(list size), not O(total bytes).
The returned ByteString
is not necessarily a unique object. If the list is empty,
the returned object is the singleton empty ByteString
. If the list has only one
element, that ByteString
will be returned without copying.
copyFrom(String text, String charsetName)
public
static
ByteString
copyFrom
(
String
text
,
String
charsetName
)
Encodes text
into a sequence of bytes using the named charset and returns the result as
a ByteString
.
copyFrom(String text, Charset charset)
public
static
ByteString
copyFrom
(
String
text
,
Charset
charset
)
Encodes text
into a sequence of bytes using the named charset and returns the result as
a ByteString
.
copyFrom(ByteBuffer bytes)
public
static
ByteString
copyFrom
(
ByteBuffer
bytes
)
Copies the remaining bytes from a java.nio.ByteBuffer
into a ByteString
.
copyFrom(ByteBuffer bytes, int size)
public
static
ByteString
copyFrom
(
ByteBuffer
bytes
,
int
size
)
Copies the next size
bytes from a java.nio.ByteBuffer
into a ByteString
.
copyFromUtf8(String text)
public
static
ByteString
copyFromUtf8
(
String
text
)
Encodes text
into a sequence of UTF-8 bytes and returns the result as a ByteString
.
newOutput()
public
static
ByteString
.
Output
newOutput
()
Creates a new Output
. Call Output#toByteString()
to create the ByteString
instance.
A ByteString.Output
offers the same functionality as a ByteArrayOutputStream
, except that it returns a ByteString
rather than a byte
array
.
newOutput(int initialCapacity)
public
static
ByteString
.
Output
newOutput
(
int
initialCapacity
)
Creates a new Output
with the given initial capacity. Call Output#toByteString()
to create the ByteString
instance.
A ByteString.Output
offers the same functionality as a ByteArrayOutputStream
, except that it returns a ByteString
rather than a byte
array.
readFrom(InputStream streamToDrain)
public
static
ByteString
readFrom
(
InputStream
streamToDrain
)
Completely reads the given stream's bytes into a ByteString
, blocking if necessary
until all bytes are read through to the end of the stream.
Performance notes:
The returned ByteString
is an immutable tree of byte
arrays ("chunks") of the stream data. The first chunk is small, with subsequent chunks each
being double the size, up to 8K.
Each byte read from the input stream will be copied twice to ensure that the resulting ByteString is truly immutable.
streamToDrain
A new ByteString
which is made up of chunks of various sizes, depending on the
behavior of the underlying stream.
readFrom(InputStream streamToDrain, int chunkSize)
public
static
ByteString
readFrom
(
InputStream
streamToDrain
,
int
chunkSize
)
Completely reads the given stream's bytes into a ByteString
, blocking if necessary
until all bytes are read through to the end of the stream.
Performance notes:
The returned ByteString
is an immutable tree of byte
arrays ("chunks") of the stream data. The chunkSize parameter sets the size of these byte
arrays.
Each byte read from the input stream will be copied twice to ensure that the resulting ByteString is truly immutable.
streamToDrain
chunkSize
readFrom(InputStream streamToDrain, int minChunkSize, int maxChunkSize)
public
static
ByteString
readFrom
(
InputStream
streamToDrain
,
int
minChunkSize
,
int
maxChunkSize
)
Helper method that takes the chunk size range as a parameter.
streamToDrain
minChunkSize
maxChunkSize
a new ByteString
which is made up of chunks within the given size range
unsignedLexicographicalComparator()
public
static
Comparator<ByteString>
unsignedLexicographicalComparator
()
Returns a Comparator which compares ByteString -s lexicographically as sequences of unsigned bytes (i.e. values between 0 and 255, inclusive).
For example, (byte) -1
is considered to be greater than (byte) 1
because it
is interpreted as an unsigned value, 255
:
-
-1
-> 0b11111111 (two's complement) -> 255 -
1
-> 0b00000001 -> 1
Methods
asReadOnlyByteBuffer()
public
abstract
ByteBuffer
asReadOnlyByteBuffer
()
Constructs a read-only java.nio.ByteBuffer
whose content is equal to the contents of
this byte string. The result uses the same backing array as the byte string, if possible.
asReadOnlyByteBufferList()
public
abstract
List<ByteBuffer>
asReadOnlyByteBufferList
()
Constructs a list of read-only java.nio.ByteBuffer
objects such that the concatenation
of their contents is equal to the contents of this byte string. The result uses the same
backing arrays as the byte string.
By returning a list, implementations of this method may be able to avoid copying even when there are multiple backing arrays.
byteAt(int index)
public
abstract
byte
byteAt
(
int
index
)
Gets the byte at the given index. This method should be used only for random access to individual bytes. To access bytes sequentially, use the ByteIterator returned by #iterator() , and call #substring(int, int) first if necessary.
concat(ByteString other)
public
final
ByteString
concat
(
ByteString
other
)
Concatenate the given ByteString
to this one. Short concatenations, of total size
smaller than ByteString#CONCATENATE_BY_COPY_SIZE
, are produced by copying the
underlying bytes (as per Rope.java, BAP95
. In general, the concatenate involves no copying.
copyTo(byte[] target, int offset)
public
void
copyTo
(
byte
[]
target
,
int
offset
)
Copies bytes into a buffer at the given offset.
To copy a subset of bytes, you call this method on the return value of #substring(int, int)
. Example: byteString.substring(start, end).copyTo(target, offset)
copyTo(byte[] target, int sourceOffset, int targetOffset, int numberToCopy) (deprecated)
public
final
void
copyTo
(
byte
[]
target
,
int
sourceOffset
,
int
targetOffset
,
int
numberToCopy
)
Deprecated. Instead, call byteString.substring(sourceOffset, sourceOffset +
numberToCopy).copyTo(target, targetOffset)
Copies bytes into a buffer.
copyTo(ByteBuffer target)
public
abstract
void
copyTo
(
ByteBuffer
target
)
Copies bytes into a ByteBuffer.
To copy a subset of bytes, you call this method on the return value of #substring(int, int)
. Example: byteString.substring(start, end).copyTo(target)
copyToInternal(byte[] target, int sourceOffset, int targetOffset, int numberToCopy)
protected
abstract
void
copyToInternal
(
byte
[]
target
,
int
sourceOffset
,
int
targetOffset
,
int
numberToCopy
)
Internal (package private) implementation of #copyTo(byte[],int,int,int)
. It assumes
that all error checking has already been performed and that numberToCopy > 0
.
endsWith(ByteString suffix)
public
final
boolean
endsWith
(
ByteString
suffix
)
Tests if this bytestring ends with the specified suffix. Similar to String#endsWith(String)
true
if the byte sequence represented by the argument is a suffix of the
byte sequence represented by this string; false
otherwise.
equals(Object o)
public
abstract
boolean
equals
(
Object
o
)
getTreeDepth()
protected
abstract
int
getTreeDepth
()
Return the depth of the tree representing this ByteString
, if any, whose root is this
node. If this is a leaf node, return 0.
hashCode()
public
final
int
hashCode
()
Compute the hashCode using the traditional algorithm from ByteString .
isBalanced()
protected
abstract
boolean
isBalanced
()
Return true
if this ByteString is literal (a leaf node) or a flat-enough tree in the
sense of RopeByteString
.
isEmpty()
public
final
boolean
isEmpty
()
Returns true
if the size is 0
, false
otherwise.
isValidUtf8()
public
abstract
boolean
isValidUtf8
()
Tells whether this ByteString
represents a well-formed UTF-8 byte sequence, such that
the original bytes can be converted to a String object and then round tripped back to bytes
without loss.
More precisely, returns true
whenever:
Arrays
.
equals
(
byteString
.
toByteArray
(),
new
String
(
byteString
.
toByteArray
(),
"UTF-8"
).
getBytes
(
"UTF-8"
))
This method returns false
for "overlong" byte sequences, as well as for 3-byte
sequences that would map to a surrogate character, in accordance with the restricted definition
of UTF-8 introduced in Unicode 3.1. Note that the UTF-8 decoder included in Oracle's JDK has
been modified to also reject "overlong" byte sequences, but (as of 2011) still accepts 3-byte
surrogate character byte sequences.
See the Unicode Standard,
Table 3-6. UTF-8 Bit Distribution
,
Table 3-7. Well Formed UTF-8 Byte Sequences
.
whether the bytes in this ByteString
are a well-formed UTF-8 byte sequence
iterator()
public
ByteString
.
ByteIterator
iterator
()
Return a ByteString.ByteIterator over the bytes in the ByteString. To avoid auto-boxing, you may get the iterator manually and call ByteIterator#nextByte() .
newCodedInput()
public
abstract
CodedInputStream
newCodedInput
()
Creates a CodedInputStream which can be used to read the bytes. Using this is often more efficient than creating a CodedInputStream that wraps the result of #newInput() .
newInput()
public
abstract
InputStream
newInput
()
Creates an InputStream
which can be used to read the bytes.
The InputStream
returned by this method is guaranteed to be completely non-blocking.
The method InputStream#available()
returns the number of bytes remaining in the stream.
The methods InputStream#read(byte[])
, InputStream#read(byte[],int,int)
and InputStream#skip(long)
will read/skip as many bytes as are available. The method InputStream#markSupported()
returns true
.
The methods in the returned InputStream might not be thread safe.
partialHash(int h, int offset, int length)
protected
abstract
int
partialHash
(
int
h
,
int
offset
,
int
length
)
Compute the hash across the value bytes starting with the given hash, and return the result. This is used to compute the hash across strings represented as a set of pieces by allowing the hash computation to be continued from piece to piece.
partialIsValidUtf8(int state, int offset, int length)
protected
abstract
int
partialIsValidUtf8
(
int
state
,
int
offset
,
int
length
)
Tells whether the given byte sequence is a well-formed, malformed, or incomplete UTF-8 byte
sequence. This method accepts and returns a partial state result, allowing the bytes for a
complete UTF-8 byte sequence to be composed from multiple ByteString
segments.
-1
if the partial byte sequence is definitely malformed, 0
if it is
well-formed (no additional input needed), or, if the byte sequence is "incomplete", i.e.
apparently terminated in the middle of a character, an opaque integer "state" value
containing enough information to decode the character when passed to a subsequent
invocation of a partial decoding method.
peekCachedHashCode()
protected
final
int
peekCachedHashCode
()
Return the cached hash code if available.
size()
public
abstract
int
size
()
Gets the number of bytes.
startsWith(ByteString prefix)
public
final
boolean
startsWith
(
ByteString
prefix
)
Tests if this bytestring starts with the specified prefix. Similar to String#startsWith(String)
true
if the byte sequence represented by the argument is a prefix of the
byte sequence represented by this string; false
otherwise.
substring(int beginIndex)
public
final
ByteString
substring
(
int
beginIndex
)
Return the substring from beginIndex
, inclusive, to the end of the string.
substring(int beginIndex, int endIndex)
public
abstract
ByteString
substring
(
int
beginIndex
,
int
endIndex
)
Return the substring from beginIndex
, inclusive, to endIndex
, exclusive.
toByteArray()
public
final
byte
[]
toByteArray
()
Copies bytes to a byte[]
.
toString()
public
final
String
toString
()
toString(String charsetName)
public
final
String
toString
(
String
charsetName
)
Constructs a new String
by decoding the bytes using the specified charset.
toString(Charset charset)
public
final
String
toString
(
Charset
charset
)
Constructs a new String
by decoding the bytes using the specified charset. Returns the
same empty String if empty.
toStringInternal(Charset charset)
protected
abstract
String
toStringInternal
(
Charset
charset
)
Constructs a new String
by decoding the bytes using the specified charset.
toStringUtf8()
public
final
String
toStringUtf8
()
Constructs a new String
by decoding the bytes as UTF-8.
writeTo(OutputStream out)
public
abstract
void
writeTo
(
OutputStream
out
)
Writes a copy of the contents of this byte string to the specified output stream argument.