V každé nové verzi Delphi přibude pár užitečných tříd, no a kromě jiných je to v Delphi XE implementace TBinaryReader a TBinaryWriter. Je jasné, že se něco podobného dá naprogramovat za odpoledne, ale přesto mne originální implementace potěšila.
Jak názvy napovídají, jedná se o třídy pomáhající s implementací binárního zápisu a čtení to streamu (souboru). Uvedu rovnou nějaký příklad:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
var
oReader: TBinaryReader;
oWriter: TBinaryWriter;
s: string = 'Temp Text';
s2: string;
d: double = 3.5;
begin
s2 := StringOfChar('A', 400);
oWriter := TBinaryWriter.Create('test');
try
oWriter.Write(s); // string
oWriter.Write(byte(1)); // byte
oWriter.Write(True); // boolean
oWriter.Write(d); // double 8byte
oWriter.Write(s2); // string
finally
oWriter.Free;
end;
oReader := TBinaryReader.Create('test');
try
writeln(oReader.ReadString);
writeln(oReader.ReadByte);
writeln(oReader.ReadBoolean);
writeln(oReader.ReadDouble);
writeln(oReader.ReadString);
finally
oReader.Free;
end;
end.
Velmi přímočaré.
Osobně se mi líbí ukládání a načítání stringu, kdy naprosto transparentně je ukládána před řetězec velikost a to celkem efektivně, kdy pro délku do 127 byte (tj. 7 bitů, eliminace problémů s načítáním) je např. použit jen jeden byte atd. Při načítání nemusíte nic řešit, řetězec bude načten správně.
To ale není vše. Navíc se dá v konstruktoru předat kódování pod kterým budou stringy ukládány (nebo načítány). Následující kód uloží text jako UTF8. Kromě uvedené lze v konstruktoru předat stream.
oWriter := TBinaryWriter.Create('test2', False, TEncoding.UTF8);
try
oWriter.Write('Příliš žluťoučký kůň úpěl ďábelské ódy');
finally
oWriter.Free;
end;
Pro doplnění: online dokumentace TBinaryWriter a TBinaryReader.