[DUG] Potential bug in XE2

Jolyon Smith jsmith at deltics.co.nz
Mon Jul 2 10:05:21 NZST 2012


Oops, I also meant to add:  if you have fallen foul of this aspect of
TStrings then I would say the real "bug" is in the stream class you are
using, not TStrings.  :)


On 2 July 2012 10:04, Jolyon Smith <jsmith at deltics.co.nz> wrote:

> imho ReadBuffer/WriteBuffer are over-engineered.  They appear to be
> implemented to code around potential bugs (or perhaps an idiosyncrasy) in a
> stream implementation.
>
> If I ask a stream to read/write N bytes then that is what the stream
> should do.  If it needs to break the request into smaller "chunks" to
> satisfy the request then that should be transparent to the consumer code.
>
> I would call this "chunking" rather than "buffered".  Buffered read/write
> I/IO typically works on blocks LARGER than the individual requests, not
> smaller.  i.e. you ask to read 4 bytes but a larger buffer of (e.g.) 1KB is
> read so that future requests can be satisfied from the buffer, and asking
> to write 4 bytes just stuffs a buffer which is only *actually* written when
> then buffer is full, both designed to minimise I/O.
>
> "Chunking" does the opposite.
>
>
>
>
> On 30 June 2012 21:54, Todd Martin <todd.martin.nz at gmail.com> wrote:
>
>> TStrings.SaveToStream calls Stream.WriteBuffer()
>> whereas
>> TStrings.LoadFromStream calls Stream.Read()
>>
>> No buffering and no error message, if the buffer is not read in
>> completely!
>>
>> procedure TStrings.SaveToStream(Stream: TStream; Encoding: TEncoding);
>> var
>>   Buffer, Preamble: TBytes;
>> begin
>>   if Encoding = nil then
>>     Encoding := FDefaultEncoding;
>>   Buffer := Encoding.GetBytes(GetTextStr);
>>   if FWriteBOM then
>>   begin
>>     Preamble := Encoding.GetPreamble;
>>     if Length(Preamble) > 0 then
>>       Stream.WriteBuffer(Preamble[0], Length(Preamble));
>>   end;
>>   Stream.WriteBuffer(Buffer[0], Length(Buffer));
>> end;
>>
>>
>> procedure TStrings.LoadFromStream(Stream: TStream; Encoding: TEncoding);
>> var
>>   Size, PreambleSize: Integer;
>>   Buffer: TBytes;
>> begin
>>   BeginUpdate;
>>   try
>>     Size := Stream.Size - Stream.Position;
>>     SetLength(Buffer, Size);
>>     Stream.Read(Buffer[0], Size);
>>     PreambleSize:= TEncoding.GetBufferEncoding(Buffer, Encoding,
>> FDefaultEncoding);
>>     SetEncoding(Encoding); // Keep Encoding in case the stream is saved
>>     SetTextStr(Encoding.GetString(Buffer, PreambleSize, Length(Buffer) -
>> PreambleSize));
>>   finally
>>     EndUpdate;
>>   end;
>> end;
>>
>>
>> _______________________________________________
>> NZ Borland Developers Group - Delphi mailing list
>> Post: delphi at listserver.123.net.nz
>> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>> Unsubscribe: send an email to delphi-request at listserver.123.net.nz with
>> Subject: unsubscribe
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20120702/b0eadf40/attachment.html 


More information about the Delphi mailing list