Я хочу создать InputStream, который ограничен определенным диапазоном байтов в файле, например, к байтам от положения 0 до 100. Так, чтобы клиентский код видел EOF, после того как 100-й байт достигнут.
Метод read ()
для InputStream
читает по одному байту за раз. Вы можете написать подкласс InputStream
, который поддерживает внутренний счетчик; каждый раз, когда вызывается read ()
, обновляйте счетчик. Если вы достигли своего максимума, не разрешайте дальнейшее чтение (верните -1 или что-то в этом роде).
Вам также необходимо убедиться, что другие методы чтения read_int
и т. Д. Не поддерживаются (например: переопределите их и просто выбросите UnsupportedOperationException ());
Я не знаю, что вы используете случай есть, но в качестве бонуса вы можете также реализовать буферизацию.
Как данбен говорит , просто украсьте свой поток и установите ограничение:
public class ConstrainedInputStream extends InputStream {
private final InputStream decorated;
private long length;
public ConstrainedInputStream(InputStream decorated, long length) {
this.decorated = decorated;
this.length = length;
}
@Override public int read() throws IOException {
return (length-- <= 0) ? -1 : decorated.read();
}
// TODO: override other methods if you feel it's necessary
// optionally, extend FilterInputStream instead
}
Рассмотрите возможность использования http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/LimitInputStream.html
Если вам нужно всего 100 байтов, то, вероятно, лучше всего будет просто, я бы прочитал их в массив и заключил в ByteArrayInputStream. Например.
int length = 100;
byte[] data = new byte[length];
InputStream in = ...; //your inputstream
DataInputStream din = new DataInputStream(din);
din.readFully(data);
ByteArrayInputStream first100Bytes = new ByteArrayInputStream(data);
// pass first100bytes to your clients
Если вы не хотите использовать DataInputStream.readFully
, существует IOUtils.readFully
из apache commons-io, или вы можете явно реализовать цикл чтения.
Если у вас есть более сложные потребности, такие как чтение из сегмента в середине файла или большие объемы данных, то расширение InputStream и переопределение чтения (byte [], int, int), а также чтения ( ), даст вам лучшую производительность, чем просто переопределение метода read ().