package org.embulk.spi.util;
import java.io.InputStream;
import org.embulk.spi.Buffer;
import org.embulk.spi.FileInput;
public class FileInputInputStream
extends InputStream
{
private final FileInput in;
private int pos;
private Buffer buffer = Buffer.EMPTY;
public FileInputInputStream(FileInput in)
{
this.in = in;
}
public boolean markSupported()
{
return false;
}
public boolean nextFile()
{
releaseBuffer();
return in.nextFile();
}
@Override
public int available()
{
return buffer.limit() - pos;
}
@Override
public int read()
{
while (pos >= buffer.limit()) {
if (!nextBuffer()) {
return -1;
}
}
byte b = buffer.array()[buffer.offset() + pos];
pos++;
if (pos >= buffer.limit()) {
releaseBuffer();
}
return b & 0xff;
}
@Override
public int read(byte[] b, int off, int len)
{
while (pos >= buffer.limit()) {
if (!nextBuffer()) {
return -1;
}
}
int remaining = buffer.limit() - pos;
boolean allConsumed;
if (remaining <= len) {
allConsumed = true;
len = remaining;
} else {
allConsumed = false;
}
if (b != null) {
// b == null if skip
buffer.getBytes(pos, b, off, len);
}
if (allConsumed) {
releaseBuffer();
} else {
pos += len;
}
return len;
}
@Override
public long skip(long len)
{
int skipped = read(null, 0, (int) Math.min(len, Integer.MAX_VALUE));
return skipped > 0 ? skipped : 0;
}
private boolean nextBuffer()
{
releaseBuffer();
Buffer b = in.poll();
if (b == null) {
return false;
}
buffer = b;
return true;
}
private void releaseBuffer()
{
buffer.release();
buffer = Buffer.EMPTY;
pos = 0;
}
@Override
public void close()
{
releaseBuffer();
in.close();
}
}