/// <inheritdoc /> /// <remarks>Assumes nearly sequential access.</remarks> public byte ReadByte(long index) { IDataStreamHelpers.ReadByteArgsCheck(this, index); byte ret; lock (cacheLock) { if (!cache.TryReadByte(index, out ret)) { ByteCache.FillCache callback = delegate(byte[] buffer, out long cacheStart, out int cacheLength) { using (var reader = log.ReaderPool.Get()) { // the file is more likely to be read from the beginning to the end cacheStart = Math.Max(0, index - 32); cacheLength = (int)Math.Min(buffer.Length, Math.Min(int.MaxValue, length - cacheStart)); reader.ReadFileDataToBuffer(hint, buffer, cacheStart, cacheLength, 0); ret = buffer[index - cacheStart]; } }; cache.Cache(callback); } } return(ret); }
/// <inheritdoc/> public byte ReadByte(long index) { streamsLock.EnterReadLock(); try { IDataStreamHelpers.ReadByteArgsCheck(this, index); int i = 0; while (index >= 0) { var stream = streams[i++]; if (index >= stream.Length) { index -= stream.Length; } else { return(stream.ReadByte(index)); } } // unreachable code throw new ArgumentOutOfRangeException(); } finally { streamsLock.ExitReadLock(); } }
/// <inheritdoc /> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); using (var reader = log.ReaderPool.Get()) { reader.ReadFileDataToBuffer(hint, buffer, start, length, offset); } }
/// <inheritdoc/> public byte ReadByte(long index) { IDataStreamHelpers.ReadByteArgsCheck(this, index); lock (streamLock) { stream.Position = index; return((byte)stream.ReadByte()); } }
/// <inheritdoc/> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); if (length == -1) { length = (int)Math.Min(int.MaxValue, Length - start); } if (start + length > count || start < 0 || length < 0) { throw new ArgumentOutOfRangeException("wrong index or length"); } stream.ReadBytesToBuffer(buffer, this.offset + start, length, offset); }
/// <inheritdoc/> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { streamsLock.EnterReadLock(); try { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); if (length == 0) { return; } var workBuffer = new ArraySegment <byte>(buffer, offset, length); int i = 0; var stream = streams[0]; // move to the stream containing the start while (start >= stream.Length) { if (i == streams.Count) { throw new ArgumentOutOfRangeException(); } start -= stream.Length; stream = streams[++i]; } do { var len = (int)Math.Min(length, stream.Length - start); length -= len; stream.ReadBytesToBuffer(workBuffer.Array, start, len, workBuffer.Offset); if (length > 0) { workBuffer = new ArraySegment <byte>(workBuffer.Array, workBuffer.Offset + len, workBuffer.Count - len); i++; if (i == streams.Count && length > 0) { throw new ArgumentOutOfRangeException(); } if (i == streams.Count) { return; } stream = streams[i]; start = 0; } } while (length > 0); } finally { streamsLock.ExitReadLock(); } }
/// <inheritdoc/> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); lock (streamLock) { stream.Position = start; int read = 0; while (length > 0 && (read = stream.Read(buffer, offset, length)) != 0) { length -= read; offset += read; } } }
/// <inheritdoc/> public byte ReadByte(long index) { IDataStreamHelpers.ReadByteArgsCheck(this, index); byte ret; lock (dataLock) { if (cache.TryReadByte(index, out ret)) { return(ret); } seekToPosition(index); cache.TryReadByte(index, out ret); return(ret); } }
/// <inheritdoc/> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); lock (dataLock) { while (length > 0) { int chunk = Math.Min(length, cache.MaxCacheSize); seekToPosition(start + chunk - 1); // no need to check these, because the cache is set so that it will be ok long firstRead; int read; cache.TryReadBytesToBuffer(buffer, start, chunk, offset, out firstRead, out read); length -= chunk; start += chunk; offset += chunk; } } }
/// <inheritdoc/> public byte ReadByte(long index) { IDataStreamHelpers.ReadByteArgsCheck(this, index); return(stream.ReadByte(offset + index)); }
/// <inheritdoc/> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); Array.Copy(arr, start, buffer, offset, length); }
/// <inheritdoc/> public byte ReadByte(long index) { IDataStreamHelpers.ReadByteArgsCheck(this, index); return arr[index]; }