Fantom

 

class

sys::Buf

sys::Obj
  sys::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 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.

Slots

capacitySource

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.

charsetSource

Charset charset

Character set for both the OutStream and InStream.

clearSource

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.

closeSource

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.

dupSource

Buf dup()

Create a new buffer in memory which deeply clones this buffer.

eachLineSource

Void eachLine(|Str| f)

Convenience for in.eachLine

endianSource

Endian endian

Byte order mode for both OutStream and InStream. Default is Endian.big (network byte order).

equalsSource

override Bool equals(Obj? that)

Overrides sys::Obj.equals

Buf equality is based on reference equality using the === operator.

fillSource

This fill(Int byte, Int times)

Write the specified byte to the end of the buffer using given count.

Examples:

Buf().fill(0xff, 4)  =>  0xffffffff
flipSource

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.

flushSource

This flush()

If this Buf is backed by a file, then force all changes to the storage device. Throw IOErr on error. Return this.

fromBase64Source

static Buf fromBase64(Str s)

Decode the specified Base64 string into its binary contents as defined by MIME RFC 2045. Any characters which are not included in the Base64 character set are safely ignored.

Example:

Buf.make.print("Fan").toBase64    => "RmFu"
Buf.fromBase64("RmFu").readAllStr => "Fan"
fromHexSource

static Buf fromHex(Str s)

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"
getSource

Int get(Int index)

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.

hmacSource

Buf hmac(Str algorithm, Buf key)

Generate an HMAC message authentication as specified by RFC 2104. This buffer is the data input, algorithm specifies the hash digest, and key represents the secret key:

  • H: specified by algorthim parameter - "MD5" or "SHA1"
  • K: secret key specified by key parameter
  • B: fixed at 64
  • text: this instance

The HMAC is computed using:

ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times
H(K XOR opad, H(K XOR ipad, text))

Throw ArgErr if the algorithm is not available. This method is only supported for memory buffers.

Examples:

"hi there".toBuf.hmac("MD5", "secret".toBuf)
inSource

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 use Buf.close.

isEmptySource

Bool isEmpty()

Return if size() == 0.

makeSource

static Buf make(Int capacity := 1024)

Allocate a byte buffer in RAM with the initial given capacity.

moreSource

Bool more()

Return if more bytes are available to read: remaining() > 0.

outSource

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 use Buf.close.

peekSource

Int? peek()

Convenience for in.peek

peekCharSource

Int? peekChar()

Convenience for in.peekChar

posSource

Int pos()

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 with seek.

printSource

This print(Obj? s)

Convenience for out.print Return this.

printLineSource

This printLine(Obj? obj := "")

Convenience for out.printLine Return this.

randomSource

static Buf random(Int size)

Generate a random series of bytes.

Example:

Buf.random(8).toHex  => "d548b54989028b90"
readSource

Int? read()

Convenience for in.read

readAllBufSource

Buf readAllBuf()

Convenience for in.readAllBuf

readAllLinesSource

Str[] readAllLines()

Convenience for in.readAllLines

readAllStrSource

Str readAllStr(Bool normalizeNewlines := true)

Convenience for in.readAllStr

readBoolSource

Bool readBool()

Convenience for in.readBool

readBufSource

Int? readBuf(Buf buf, Int n)

Convenience for in.readBuf

readBufFullySource

Buf readBufFully(Buf? buf, Int n)

Convenience for in.readBufFully

readCharSource

Int? readChar()

Convenience for in.readChar

readCharsSource

Str readChars(Int n)

Convenience for in.readChars

readDecimalSource

Decimal readDecimal()

Convenience for in.readDecimal

readF4Source

Float readF4()

Convenience for in.readF4

readF8Source

Float readF8()

Convenience for in.readF8

readLineSource

Str? readLine(Int? max := (Int?)4096)

Convenience for in.readLine

readObjSource

Obj? readObj([Str:Obj]? options := null)

Convenience for in.readObj

readS1Source

Int readS1()

Convenience for in.readS1

readS2Source

Int readS2()

Convenience for in.readS2

readS4Source

Int readS4()

Convenience for in.readS4

readS8Source

Int readS8()

Convenience for in.readS8

readStrTokenSource

Str? readStrToken(Int? max := (Int?)4096, |Int -> Bool|? c := null)

Convenience for in.readStrToken

readU1Source

Int readU1()

Convenience for in.readU1

readU2Source

Int readU2()

Convenience for in.readU2

readU4Source

Int readU4()

Convenience for in.readU4

readUtfSource

Str readUtf()

Convenience for in.readUtf

remainingSource

Int remaining()

Return the remaining number of bytes to read: size-pos.

seekSource

This seek(Int pos)

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.

setSource

This set(Int index, 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.

sizeSource

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.

sliceSource

Buf slice(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]
toBase64Source

Str toBase64()

Encode the buffer contents from 0 to size to a Base64 string as defined by MIME RFC 2045. No line breaks are added. This method is only supported by memory backed buffers, file backed buffers will throw UnsupportedErr.

Example:

Buf.make.print("Fan").toBase64    => "RmFu"
Buf.fromBase64("RmFu").readAllStr => "Fan"
toDigestSource

Buf toDigest(Str algorithm)

Apply the specified message digest algorthm to this buffer's contents from 0 to size and return the resulting hash. Digests are secure one-way hash functions which input an arbitrary sized buffer and return a fixed sized buffer. Common algorithms include: "MD5", "SHA-1", and "SHA-256"; the full list supported is platform dependent. On the Java VM, the algorithm maps to those avaialble via the java.security.MessageDigest API. Throw ArgErr if the algorithm is not available. This method is unsupported for mmap buffers.

Example:

Buf.make.print("password").print("salt").toDigest("MD5").toHex
 =>  "b305cadbb3bce54f3aa59c64fec00dea"
toHexSource

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"
toStrSource

override Str toStr()

Overrides sys::Obj.toStr

Return string summary of the buffer.

trimSource

This trim()

Trim the capacity such that the underlying storage is optimized for the current size. Return this.

unreadSource

This unread(Int b)

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.

unreadCharSource

This unreadChar(Int b)

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.

writeSource

This write(Int byte)

Convenience for out.write Return this.

writeBoolSource

This writeBool(Bool b)

Convenience for out.writeBool Return this.

writeBufSource

This writeBuf(Buf buf, Int n := buf.remaining())

Convenience for out.writeBuf Return this.

writeCharSource

This writeChar(Int char)

Convenience for out.writeChar Return this.

writeCharsSource

This writeChars(Str str, Int off := 0, Int len := str.size() - off)

Convenience for out.writeChars Return this.

writeDecimalSource

This writeDecimal(Decimal d)

Convenience for out.writeDecimal Return this.

writeF4Source

This writeF4(Float r)

Convenience for out.writeF4 Return this.

writeF8Source

This writeF8(Float r)

Convenience for out.writeF8 Return this.

writeI2Source

This writeI2(Int n)

Convenience for out.writeI2 Return this.

writeI4Source

This writeI4(Int n)

Convenience for out.writeI4 Return this.

writeI8Source

This writeI8(Int n)

Convenience for out.writeI8 Return this.

writeObjSource

This writeObj(Obj? obj, [Str:Obj]? options := null)

Convenience for out.writeObj Return this.

writeUtfSource

This writeUtf(Str s)

Convenience for out.writeUtf Return this.

writeXmlSource

This writeXml(Str s, Int flags := 0)

Convenience for out.writeXml Return this.