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.
78 lines
2.3 KiB
78 lines
2.3 KiB
package SevenZip.Common;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
|
|
public class InBuffer {
|
|
|
|
int _bufferPos;
|
|
int _bufferLimit;
|
|
byte [] _bufferBase;
|
|
InputStream _stream = null; // CMyComPtr<ISequentialInStream>
|
|
long _processedSize;
|
|
int _bufferSize;
|
|
boolean _wasFinished;
|
|
|
|
public InBuffer() {
|
|
|
|
}
|
|
// ~CInBuffer() { Free(); }
|
|
|
|
public void Create(int bufferSize) {
|
|
final int kMinBlockSize = 1;
|
|
if (bufferSize < kMinBlockSize)
|
|
bufferSize = kMinBlockSize;
|
|
if (_bufferBase != null && _bufferSize == bufferSize)
|
|
return ;
|
|
Free();
|
|
_bufferSize = bufferSize;
|
|
_bufferBase = new byte[bufferSize];
|
|
}
|
|
void Free() {
|
|
_bufferBase = null;
|
|
}
|
|
|
|
public void SetStream(InputStream stream) { // ISequentialInStream
|
|
_stream = stream;
|
|
}
|
|
public void Init() {
|
|
_processedSize = 0;
|
|
_bufferPos = 0; // = _bufferBase;
|
|
_bufferLimit = 0; // _buffer;
|
|
_wasFinished = false;
|
|
}
|
|
public void ReleaseStream() throws IOException {
|
|
if (_stream != null) _stream.close(); // _stream.Release();
|
|
_stream = null;
|
|
}
|
|
|
|
public int read() throws IOException {
|
|
if(_bufferPos >= _bufferLimit)
|
|
return ReadBlock2();
|
|
return _bufferBase[_bufferPos++] & 0xFF;
|
|
}
|
|
|
|
public boolean ReadBlock() throws IOException {
|
|
if (_wasFinished)
|
|
return false;
|
|
_processedSize += _bufferPos; // (_buffer - _bufferBase);
|
|
|
|
int numProcessedBytes = _stream.read(_bufferBase, 0,_bufferSize);
|
|
if (numProcessedBytes == -1) numProcessedBytes = 0; // EOF
|
|
|
|
_bufferPos = 0; // _bufferBase;
|
|
_bufferLimit = numProcessedBytes; // _buffer + numProcessedBytes;
|
|
_wasFinished = (numProcessedBytes == 0);
|
|
return (!_wasFinished);
|
|
}
|
|
|
|
public int ReadBlock2() throws IOException {
|
|
if(!ReadBlock())
|
|
return -1; // 0xFF;
|
|
return _bufferBase[_bufferPos++] & 0xFF;
|
|
}
|
|
|
|
public long GetProcessedSize() { return _processedSize + (_bufferPos); }
|
|
public boolean WasFinished() { return _wasFinished; }
|
|
}
|