vložil Radek Červinka
16. října 2010 00:44
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:
1program Project1;
2
3
4
5uses
6 SysUtils, Classes;
7var
8 oReader: TBinaryReader;
9 oWriter: TBinaryWriter;
10 s: string = 'Temp Text';
11 s2: string;
12 d: double = 3.5;
13begin
14 s2 := StringOfChar('A', 400);
15 oWriter := TBinaryWriter.Create('test');
16 try
17 oWriter.Write(s);
18 oWriter.Write(byte(1));
19 oWriter.Write(True);
20 oWriter.Write(d);
21 oWriter.Write(s2);
22 finally
23 oWriter.Free;
24 end;
25
26 oReader := TBinaryReader.Create('test');
27 try
28 writeln(oReader.ReadString);
29 writeln(oReader.ReadByte);
30 writeln(oReader.ReadBoolean);
31 writeln(oReader.ReadDouble);
32 writeln(oReader.ReadString);
33 finally
34 oReader.Free;
35 end;
36end.
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.
1oWriter := TBinaryWriter.Create('test2', False, TEncoding.UTF8);
2 try
3 oWriter.Write('Příliš žluťoučký kůň úpěl ďábelské ódy');
4 finally
5 oWriter.Free;
6 end;
Pro doplnění: online dokumentace TBinaryWriter a TBinaryReader.