module Netstream:A netstream is an input channel that is read block by block. The fragment of the channel currently loaded into memory is called the current window of the netstream. The window can be thought as look-ahead buffer.sig
..end
Picture:
0 pos_in pos_in + window_length EOF
+------------------+-------------------+--------------------------+
====================
The current window
You can use a netstream like an in_obj_channel
, and read characters
and strings from the stream. The bytes come first from the look-ahead
buffer, and if there are not enough bytes, they are loaded from the
underlying channel. After every read operation it is tried to enlarge
the window such that it contains at least one block.
If you want that the window becomes larger, you can call want
(to
enlarge the window to a certain size) or want_another_block
(to load
just another block from the underlying channel). Note that this affects only
the current window and not the future size of the window.
Note Buffer_underrun
: netstreams can cope with underruns of underlying
channels. An underrun happens when it is not possible to ensure the
minimum window size. However, it is possible that the window size
sinks under the minimum, but the Buffer_underrun
is deferred until the
next call of an input method. Furthermore, there is a problem in the skip
method which may only be partially executed, i.e. the method skips some
bytes and then raises Buffer_underrun
.
class type in_obj_stream =object
..end
in_obj_stream
extends in_obj_channel
by look-ahead methods
class input_stream :?len:int -> ?block_size:int -> Netchannels.in_obj_channel ->
in_obj_stream
in_obj_stream
on top of an in_obj_channel
.
class sub_stream :?len:int -> ?delimiter:string -> in_obj_stream ->
in_obj_stream
len
and
delimiter
.
val print_in_obj_stream : Format.formatter -> in_obj_stream -> unit