Implemented ReadByte/WriteByte on streams to improve performance

This commit is contained in:
Julien Lebosquain
2018-05-27 00:50:16 +02:00
parent 9e96dec8c9
commit 540618c062
17 changed files with 186 additions and 3 deletions

View File

@@ -66,6 +66,16 @@ namespace SharpCompress.Common
return read;
}
public override int ReadByte()
{
int value = _stream.ReadByte();
if (value == -1)
{
_completed = true;
}
return value;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();

View File

@@ -72,6 +72,22 @@ namespace SharpCompress.Common.Tar
return read;
}
public override int ReadByte()
{
if (BytesLeftToRead <= 0)
{
return -1;
}
int value = Stream.ReadByte();
if (value != -1)
{
--BytesLeftToRead;
++_amountRead;
}
return value;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();

View File

@@ -67,6 +67,11 @@ namespace SharpCompress.Compressors.BZip2
return stream.Read(buffer, offset, count);
}
public override int ReadByte()
{
return stream.ReadByte();
}
public override long Seek(long offset, SeekOrigin origin)
{
return stream.Seek(offset, origin);
@@ -82,6 +87,11 @@ namespace SharpCompress.Compressors.BZip2
stream.Write(buffer, offset, count);
}
public override void WriteByte(byte value)
{
stream.WriteByte(value);
}
/// <summary>
/// Consumes two bytes to test if there is a BZip2 header
/// </summary>

View File

@@ -1077,6 +1077,10 @@ namespace SharpCompress.Compressors.BZip2
{
}
public override void WriteByte(byte value)
{
}
public override bool CanRead => true;
public override bool CanSeek => false;

View File

@@ -1929,6 +1929,11 @@ namespace SharpCompress.Compressors.BZip2
return 0;
}
public override int ReadByte()
{
return -1;
}
public override long Seek(long offset, SeekOrigin origin)
{
return 0;

View File

@@ -282,6 +282,15 @@ namespace SharpCompress.Compressors.Deflate
return _baseStream.Read(buffer, offset, count);
}
public override int ReadByte()
{
if (_disposed)
{
throw new ObjectDisposedException("DeflateStream");
}
return _baseStream.ReadByte();
}
/// <summary>
/// Calling this method always throws a <see cref="NotImplementedException"/>.
/// </summary>
@@ -340,6 +349,15 @@ namespace SharpCompress.Compressors.Deflate
_baseStream.Write(buffer, offset, count);
}
public override void WriteByte(byte value)
{
if (_disposed)
{
throw new ObjectDisposedException("DeflateStream");
}
_baseStream.WriteByte(value);
}
#endregion
public MemoryStream InputBuffer => new MemoryStream(_baseStream._z.InputBuffer, _baseStream._z.NextIn,

View File

@@ -270,6 +270,15 @@ namespace SharpCompress.Compressors.Deflate
return _baseStream.Read(buffer, offset, count);
}
public override int ReadByte()
{
if (_disposed)
{
throw new ObjectDisposedException("ZlibStream");
}
return _baseStream.ReadByte();
}
/// <summary>
/// Calling this method always throws a <see cref="NotImplementedException"/>.
/// </summary>
@@ -321,6 +330,15 @@ namespace SharpCompress.Compressors.Deflate
_baseStream.Write(buffer, offset, count);
}
public override void WriteByte(byte value)
{
if (_disposed)
{
throw new ObjectDisposedException("ZlibStream");
}
_baseStream.WriteByte(value);
}
#endregion System.IO.Stream methods
}
}

View File

@@ -193,6 +193,22 @@ namespace SharpCompress.Compressors.LZMA
return count;
}
public override int ReadByte()
{
if (_mFinished)
{
return -1;
}
if (!_mIter.MoveNext())
{
_mFinished = true;
return -1;
}
return _mIter.Current;
}
public IEnumerable<byte> Run()
{
const uint kBurstSize = (1u << 18);

View File

@@ -110,6 +110,8 @@ namespace SharpCompress.Compressors.LZMA
public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count);
public override int ReadByte() => _stream.ReadByte();
public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
public override void SetLength(long value) => throw new NotImplementedException();
@@ -120,6 +122,12 @@ namespace SharpCompress.Compressors.LZMA
_writeCount += count;
}
public override void WriteByte(byte value)
{
_stream.WriteByte(value);
++_writeCount;
}
#endregion
/// <summary>

View File

@@ -51,5 +51,10 @@ namespace SharpCompress.Compressors.Xz.Filters
{
return BaseStream.Read(buffer, offset, count);
}
public override int ReadByte()
{
return BaseStream.ReadByte();
}
}
}

View File

@@ -47,6 +47,12 @@ namespace SharpCompress.Crypto
hash = CalculateCrc(table, hash, buffer, offset, count);
}
public override void WriteByte(byte value)
{
stream.WriteByte(value);
hash = CalculateCrc(table, hash, value);
}
public override bool CanRead => stream.CanRead;
public override bool CanSeek => false;
public override bool CanWrite => stream.CanWrite;
@@ -98,9 +104,16 @@ namespace SharpCompress.Crypto
unchecked
{
for (int i = offset, end = offset + count; i < end; i++)
crc = (crc >> 8) ^ table[(crc ^ buffer[i]) & 0xFF];
{
crc = CalculateCrc(table, crc, buffer[i]);
}
}
return crc;
}
private static uint CalculateCrc(uint[] table, uint crc, byte b)
{
return (crc >> 8) ^ table[(crc ^ b) & 0xFF];
}
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
namespace SharpCompress.IO
@@ -49,5 +49,11 @@ namespace SharpCompress.IO
writableStream.Write(buffer, offset, count);
Count += (uint)count;
}
public override void WriteByte(byte value)
{
writableStream.WriteByte(value);
++Count;
}
}
}

View File

@@ -47,6 +47,19 @@ namespace SharpCompress.IO
return read;
}
public override int ReadByte()
{
int value = Stream.ReadByte();
if (value == -1)
{
return -1;
}
++currentEntryTotalReadBytes;
listener.FireCompressedBytesRead(currentEntryTotalReadBytes, currentEntryTotalReadBytes);
return value;
}
public override long Seek(long offset, SeekOrigin origin)
{
return Stream.Seek(offset, origin);
@@ -61,5 +74,10 @@ namespace SharpCompress.IO
{
Stream.Write(buffer, offset, count);
}
public override void WriteByte(byte value)
{
Stream.WriteByte(value);
}
}
}

View File

@@ -44,6 +44,11 @@ namespace SharpCompress.IO
return Stream.Read(buffer, offset, count);
}
public override int ReadByte()
{
return Stream.ReadByte();
}
public override long Seek(long offset, SeekOrigin origin)
{
return Stream.Seek(offset, origin);
@@ -58,5 +63,10 @@ namespace SharpCompress.IO
{
Stream.Write(buffer, offset, count);
}
public override void WriteByte(byte value)
{
Stream.WriteByte(value);
}
}
}

View File

@@ -51,6 +51,20 @@ namespace SharpCompress.IO
return read;
}
public override int ReadByte()
{
if (BytesLeftToRead <= 0)
{
return -1;
}
int value = Stream.ReadByte();
if (value != -1)
{
--BytesLeftToRead;
}
return value;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();

View File

@@ -44,6 +44,11 @@ namespace SharpCompress.Test
return stream.Read(buffer, offset, count);
}
public override int ReadByte()
{
return stream.ReadByte();
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
@@ -55,7 +60,8 @@ namespace SharpCompress.Test
}
public override void Write(byte[] buffer, int offset, int count)
{throw new NotSupportedException();
{
throw new NotSupportedException();
}
}
}

View File

@@ -205,6 +205,9 @@ namespace SharpCompress.Test.Zip
public override int Read(byte[] buffer, int offset, int count)
{ return stream.Read(buffer, offset, count); }
public override int ReadByte()
{ return stream.ReadByte(); }
public override long Seek(long offset, SeekOrigin origin)
{ throw new NotImplementedException(); }
@@ -213,6 +216,9 @@ namespace SharpCompress.Test.Zip
public override void Write(byte[] buffer, int offset, int count)
{ stream.Write(buffer, offset, count); }
public override void WriteByte(byte value)
{ stream.WriteByte(value); }
}
}
}