98 lines
2.5 KiB
Java
98 lines
2.5 KiB
Java
/*
|
|
* Decompiled with CFR 0.152.
|
|
*/
|
|
package net.minecraft.util;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
|
|
public class FastBufferedInputStream
|
|
extends InputStream {
|
|
private static final int DEFAULT_BUFFER_SIZE = 8192;
|
|
private final InputStream in;
|
|
private final byte[] buffer;
|
|
private int limit;
|
|
private int position;
|
|
|
|
public FastBufferedInputStream(InputStream in) {
|
|
this(in, 8192);
|
|
}
|
|
|
|
public FastBufferedInputStream(InputStream in, int bufferSize) {
|
|
this.in = in;
|
|
this.buffer = new byte[bufferSize];
|
|
}
|
|
|
|
@Override
|
|
public int read() throws IOException {
|
|
if (this.position >= this.limit) {
|
|
this.fill();
|
|
if (this.position >= this.limit) {
|
|
return -1;
|
|
}
|
|
}
|
|
return Byte.toUnsignedInt(this.buffer[this.position++]);
|
|
}
|
|
|
|
@Override
|
|
public int read(byte[] output, int offset, int length) throws IOException {
|
|
int availableInBuffer = this.bytesInBuffer();
|
|
if (availableInBuffer <= 0) {
|
|
if (length >= this.buffer.length) {
|
|
return this.in.read(output, offset, length);
|
|
}
|
|
this.fill();
|
|
availableInBuffer = this.bytesInBuffer();
|
|
if (availableInBuffer <= 0) {
|
|
return -1;
|
|
}
|
|
}
|
|
if (length > availableInBuffer) {
|
|
length = availableInBuffer;
|
|
}
|
|
System.arraycopy(this.buffer, this.position, output, offset, length);
|
|
this.position += length;
|
|
return length;
|
|
}
|
|
|
|
@Override
|
|
public long skip(long count) throws IOException {
|
|
if (count <= 0L) {
|
|
return 0L;
|
|
}
|
|
long availableInBuffer = this.bytesInBuffer();
|
|
if (availableInBuffer <= 0L) {
|
|
return this.in.skip(count);
|
|
}
|
|
if (count > availableInBuffer) {
|
|
count = availableInBuffer;
|
|
}
|
|
this.position = (int)((long)this.position + count);
|
|
return count;
|
|
}
|
|
|
|
@Override
|
|
public int available() throws IOException {
|
|
return this.bytesInBuffer() + this.in.available();
|
|
}
|
|
|
|
@Override
|
|
public void close() throws IOException {
|
|
this.in.close();
|
|
}
|
|
|
|
private int bytesInBuffer() {
|
|
return this.limit - this.position;
|
|
}
|
|
|
|
private void fill() throws IOException {
|
|
this.limit = 0;
|
|
this.position = 0;
|
|
int actuallyRead = this.in.read(this.buffer, 0, this.buffer.length);
|
|
if (actuallyRead > 0) {
|
|
this.limit = actuallyRead;
|
|
}
|
|
}
|
|
}
|
|
|