CARL shall provide an extensible storage framework.
An abstract storage is a sequence of bytes that has:
1. Known length, and
2. Current position.
Normally, an input storage will act as an input stream
and an output storage shall act as an output stream. In
addition to standard stream operations, the client can:
1. Query the current size of the storage.
2. [for output storages only] Change the current size
of the storage.
3. Query or modify the current position within the storage.
Note that by above definition a RandomAccessFile is [an
extended form of, because it allows locking] a
bidirectional input+output storage.
Concrete storage implementations shall include at least:
1. FileInputStorage - treats a file as an input storage.
2. FileOutputStorage - treats a file as an output storage.
3. MemoryInputStorage - treats a block of bytes in
memory as an input storage.
4. MemoryOutputStorage - treats a block of bytes in
memory as an output storage.