培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

144 lines
3.6 KiB

using BestHTTP.PlatformSupport.Memory;
using System;
using System.IO;
namespace BestHTTP.Extensions
{
public sealed class ReadOnlyBufferedStream : Stream
{
Stream stream;
public const int READBUFFER = 8192;
byte[] buf;
int available = 0;
int pos = 0;
public ReadOnlyBufferedStream(Stream nstream)
:this(nstream, READBUFFER)
{
}
public ReadOnlyBufferedStream(Stream nstream, int bufferSize)
{
stream = nstream;
buf = BufferPool.Get(bufferSize, true);
}
public override int Read(byte[] buffer, int offset, int size)
{
if (available > 0)
{
// copy & return
int copyCount = Math.Min(available, size);
Array.Copy(buf, pos, buffer, offset, copyCount);
pos += copyCount;
available -= copyCount;
return copyCount;
}
else
{
if (size >= buf.Length)
{
// read directly to buffer
return stream.Read(buffer, offset, size);
}
else
{
// read to buf and copy
pos = 0;
available = stream.Read(buf, 0, buf.Length);
if (available > 0)
return Read(buffer, offset, size);
else
return 0;
}
}
}
public override int ReadByte()
{
if (available > 0)
{
available -= 1;
pos += 1;
return buf[pos - 1];
}
else
{
try
{
available = stream.Read(buf, 0, buf.Length);
pos = 0;
}
catch
{
return -1;
}
if (available < 1)
{
return -1;
}
else
{
available -= 1;
pos += 1;
return buf[pos - 1];
}
}
}
protected override void Dispose(bool disposing)
{
if (disposing && buf != null)
BufferPool.Release(buf);
buf = null;
}
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { throw new NotImplementedException(); }
}
public override bool CanWrite
{
get { throw new NotImplementedException(); }
}
public override long Length
{
get { throw new NotImplementedException(); }
}
public override long Position
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
public override void Flush()
{
throw new NotImplementedException();
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
}
}