99 lines
2.5 KiB
Java
99 lines
2.5 KiB
Java
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 p_196566_) {
|
|
this(p_196566_, 8192);
|
|
}
|
|
|
|
public FastBufferedInputStream(InputStream p_196568_, int p_196569_) {
|
|
this.in = p_196568_;
|
|
this.buffer = new byte[p_196569_];
|
|
}
|
|
|
|
@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[] p_196576_, int p_196577_, int p_196578_) throws IOException {
|
|
int i = this.bytesInBuffer();
|
|
if (i <= 0) {
|
|
if (p_196578_ >= this.buffer.length) {
|
|
return this.in.read(p_196576_, p_196577_, p_196578_);
|
|
}
|
|
|
|
this.fill();
|
|
i = this.bytesInBuffer();
|
|
if (i <= 0) {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
if (p_196578_ > i) {
|
|
p_196578_ = i;
|
|
}
|
|
|
|
System.arraycopy(this.buffer, this.position, p_196576_, p_196577_, p_196578_);
|
|
this.position += p_196578_;
|
|
return p_196578_;
|
|
}
|
|
|
|
@Override
|
|
public long skip(long p_196580_) throws IOException {
|
|
if (p_196580_ <= 0L) {
|
|
return 0L;
|
|
} else {
|
|
long i = this.bytesInBuffer();
|
|
if (i <= 0L) {
|
|
return this.in.skip(p_196580_);
|
|
} else {
|
|
if (p_196580_ > i) {
|
|
p_196580_ = i;
|
|
}
|
|
|
|
this.position = (int)(this.position + p_196580_);
|
|
return p_196580_;
|
|
}
|
|
}
|
|
}
|
|
|
|
@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 i = this.in.read(this.buffer, 0, this.buffer.length);
|
|
if (i > 0) {
|
|
this.limit = i;
|
|
}
|
|
}
|
|
} |