abstract rtconst class std::Buf
sys::Obj std::Buf
Buf is used to model a block of bytes with random access. Buf is typically backed by a block of memory, but can also be backed by a file:
Buf.make
: backed by RAMFile.open
: backed by random access fileFile.mmap
: backed by memory mapped file
Buf provides an InStream
and OutStream
to read and write into the buffer using a configurable position accessed via Buf.pos
and Buf.seek
.
When using an InStream, bytes are read starting at pos where pos is advanced after each read. The end of stream is reached when pos reaches size. When using the OutStream, bytes are written starting at pos with pos advanced after each write. If pos is less then size then the existing bytes are rewritten and size is not advanced, otherwise the buffer is automatically grown and size is advanced as bytes are appended. It is common to write bytes into the buffer using the OutStream, then call Buf.flip
to prepare the buffer to be used for reading.
- bytesEqual
-
Return if the buffer contents are the same size and same bytes. Note this could be an extremely expensive call for non-memory buffers.
- capacity
-
abstract Int capacity
The number of bytes this buffer can hold without allocating more memory. Capacity is always greater or equal to size. If adding a large number of bytes, it may be more efficient to manually set capacity. See the
trim
method to automatically set capacity to size. Throw ArgErr if attempting to set capacity less than size. This method is ignored on a file buffer, and unsupported on mmap. - charset
-
abstract Charset charset
Character set for both the OutStream and InStream.
- clear
-
This clear()
Read the buffer for a fresh read by reseting the buffer's pos and size to zero. The buffer's capacity remains the same. Return this.
- close
-
abstract Bool close()
If this buffer is backed by a file, then close it. If a memory buffer then do nothing. This method is guaranteed to never throw an IOErr. Return true if the buffer was closed successfully or false if closed abnormally.
- dup
-
virtual Buf dup()
Create a new buffer in memory which deeply clones this buffer.
- eachLine
-
Void eachLine(Func<Void,Str> f)
Convenience for
in.eachLine
- endian
-
abstract Endian endian
Byte order mode for both OutStream and InStream. Default is
Endian.big
(network byte order). - equals
-
virtual override Bool equals(Obj? that)
Buf equality is based on reference equality using the === operator.
- fill
-
virtual This fill(Int b, Int times)
Write the specified byte to the end of the buffer using given count.
Examples:
Buf().fill(0xff, 4) => 0xffffffff
- flip
-
This flip()
Flip a buffer from write-mode to read-mode. This method sets total size to current position, and position to 0. Return this.
- fromHex
-
Decode the specified hexadecimal string into its binary contents. Any characters which are not included in the set "0-9, a-f, A-F" are ignored as long as they appear between bytes (hi and lo nibbles must be contiguous).
Example:
Buf.make.print("\r\n").toHex => "0d0a" Buf.fromHex("0d0a").readAllStr => "\r\n"
- get
-
Get the byte at the specified absolute index. A negative index may be used to access from the end of the buffer. For example get(-1) is translated into get(size()-1). This method accesses the buffer absolutely independent of current position. The get method is accessed via the [] shortcut operator. Throw IndexErr if index out of range.
- getByte
- getBytes
-
protected abstract Int getBytes(Int pos, Array<Int8> dst, Int off, Int len)
- getRange
-
@Operator
virtual Buf getRange(Range range)Return a new buffer containing the bytes in the specified absolute range. Negative indexes may be used to access from the end of the buf. This method accesses the buffer absolutely independent of current position. This method is accessed via the [] operator. Throw IndexErr if range illegal.
Examples:
buf := Buf.make buf.write(0xaa).write(0xbb).write(0xcc).write(0xdd) buf[0..2] => 0x[aabbcc] buf[3..3] => 0x[dd] buf[-2..-1] => 0x[ccdd] buf[0..<2] => 0x[aabb] buf[1..-2] => 0x[bbcc]
- in
-
virtual InStream in()
Get the InStream which reads from this buffer. This method always returns the same instance. If this buffer is backed by a file, then
in.close
will not close the file - you must useBuf.close
. - isEmpty
-
Bool isEmpty()
Return if size() == 0.
- make
-
static new make(Int capacity := 1024)
Allocate a byte buffer in RAM with the initial given capacity.
- more
-
Bool more()
Return if more bytes are available to read: remaining() > 0.
- out
-
virtual OutStream out()
Get the OutStream which writes to this buffer. This method always returns the same instance. If this buffer is backed by a file, then
out.close
will not close the file - you must useBuf.close
. - peek
-
Int peek()
Convenience for
in.peek
- peekChar
-
Int peekChar()
Convenience for
in.peekChar
- pipeFrom
- pipeTo
- pos
-
abstract Int pos { internal set }
Return the current position for the next read or write. The position is always between 0 and
size
. If pos is less then size then future writes will rewrite the existing bytes without growing size. Change the position withseek
. -
Convenience for
out.print
Return this. - printLine
-
This printLine(Obj? obj := "")
Convenience for
out.printLine
Return this. - privateMake
-
new privateMake()
- random
-
Generate a random series of bytes.
Example:
Buf.random(8).toHex => "d548b54989028b90"
- read
-
Int read()
Convenience for
in.read
- readAllBuf
-
Buf readAllBuf()
Convenience for
in.readAllBuf
- readAllLines
-
Convenience for
in.readAllLines
- readAllStr
-
Str readAllStr(Bool normalizeNewlines := true)
Convenience for
in.readAllStr
- readBool
-
Bool readBool()
Convenience for
in.readBool
- readBuf
-
Convenience for
in.readBuf
- readBufFully
-
Buf readBufFully(Buf? buf, Int n)
Convenience for
in.readBufFully
- readChar
-
Int readChar()
Convenience for
in.readChar
- readChars
-
Convenience for
in.readChars
- readF4
-
Float readF4()
Convenience for
in.readF4
- readF8
-
Float readF8()
Convenience for
in.readF8
- readLine
-
Convenience for
in.readLine
- readS1
-
Int readS1()
Convenience for
in.readS1
- readS2
-
Int readS2()
Convenience for
in.readS2
- readS4
-
Int readS4()
Convenience for
in.readS4
- readS8
-
Int readS8()
Convenience for
in.readS8
- readStrToken
-
Str? readStrToken(Int? max := -1, Func<Bool,Int>? c := null)
Convenience for
in.readStrToken
- readU1
-
Int readU1()
Convenience for
in.readU1
- readU2
-
Int readU2()
Convenience for
in.readU2
- readU4
-
Int readU4()
Convenience for
in.readU4
- readUtf
-
Str readUtf()
Convenience for
in.readUtf
- remaining
-
Int remaining()
Return the remaining number of bytes to read: size-pos.
- safeArray
- seek
-
Set the current position to the specified byte offset. A negative index may be used to access from the end of the buffer. For example seek(-1) is translated into seek(size-1). Return this.
- set
-
@Operator
This set(Int pos, Int byte)Set is used to overwrite the byte at the specified the index. A negative index may be used to access an index from the end of the buffer. The set method is accessed via the []= shortcut operator. Return this. Throw IndexErr if index is out of range.
- setByte
- setBytes
-
protected abstract Void setBytes(Int pos, Array<Int8> src, Int off, Int len)
- size
-
abstract Int size
Return the total number of bytes in the buffer. If the size is set greater than capacity then the buffer's capacity is automatically grown, otherwise capacity remains the same. Setting size does not actually change any bytes in the buffer. A mmap buffer can never be increased from its initial size.
- sync
-
abstract This sync()
If this Buf is backed by a file, then fsync all changes to the storage device. Throw IOErr on error. Return this.
- toFile
-
Create an in-memory File instance for this buffer with the given file URI. The buffer must be a RAM based buffer which is converted to an immutable buffer via
Obj.toImmutable
semantics. The current time is used for the file's modified time. - toHex
-
virtual Str toHex()
Encode the buffer contents from 0 to size into a hexadecimal string. This method is unsupported for mmap buffers.
Example:
Buf.make.print("\r\n").toHex => "0d0a" Buf.fromHex("0d0a").readAllStr => "\r\n"
- toStr
-
virtual override Str toStr()
Return string summary of the buffer.
- trim
-
virtual This trim()
Trim the capacity such that the underlying storage is optimized for the current size. Return this.
- unread
-
Convenience for
in.unread
Memory backed buffers support a stack based pushback model like IO streams. File backed buffers will simply rewrite the last position in the file. Return this. - unreadChar
-
Convenience for
in.unreadChar
Memory backed buffers support a stack based pushback model like IO streams. File backed buffers will simply rewrite the last position in the file. Return this. - unsafeArray
-
protected virtual Array<Int8>? unsafeArray()
Convenience for in.readObj
- write
-
Convenience for
out.write
Return this. - writeBool
-
Convenience for
out.writeBool
Return this. - writeBuf
-
This writeBuf(Buf buf, Int n := buf.remaining())
Convenience for
out.writeBuf
Return this. - writeChar
-
Convenience for
out.writeChar
Return this. - writeChars
-
This writeChars(Str str, Int off := 0, Int len := str.size() - off)
Convenience for
out.writeChars
Return this. - writeF4
-
Convenience for
out.writeF4
Return this. - writeF8
-
Convenience for
out.writeF8
Return this. - writeI2
-
Convenience for
out.writeI2
Return this. - writeI4
-
Convenience for
out.writeI4
Return this. - writeI8
-
Convenience for
out.writeI8
Return this. - writeUtf
-
Convenience for
out.writeUtf
Return this.