At some point you might have to work with IStream. They are never fun to work with. Especially since you can't insert into a stream without overwriting. But that's streams.
I like to use the VCL wrappers, TOleStream and TStreamAdapter, and then use TMemoryStream. Use TOleStream to wrapping up an IStream making it look like a TStream and then use TIMemoryStream to make the TMemoryStream look like an IStream again.
Let's say for some reason we get a UTF-8 stream that needs to be saved as a file but it has no BOM. Here's a small example of how to add a BOM to the stream using Delphi:
uses ActiveX, AxCtrls, Classes;
function AddBomToStream(const Stream: IStream): IStream;
if Stream <> nil then
MemoryStream := TMemoryStream.Create;
Bom := TEncoding.UTF8.GetPreamble;
Stream.Seek(0, STREAM_SEEK_SET, Temp);
OleStream := TOleStream.Create(Stream);
Result := TStreamAdapter.Create(MemoryStream, soOwned) as IStream;