То, как я могу создать, ограничило InputStream к части только для чтения файла?

Я хочу создать InputStream, который ограничен определенным диапазоном байтов в файле, например, к байтам от положения 0 до 100. Так, чтобы клиентский код видел EOF, после того как 100-й байт достигнут.

10
задан alex2k8 22 May 2010 в 13:57
поделиться

4 ответа

Метод read () для InputStream читает по одному байту за раз. Вы можете написать подкласс InputStream , который поддерживает внутренний счетчик; каждый раз, когда вызывается read () , обновляйте счетчик. Если вы достигли своего максимума, не разрешайте дальнейшее чтение (верните -1 или что-то в этом роде).

Вам также необходимо убедиться, что другие методы чтения read_int и т. Д. Не поддерживаются (например: переопределите их и просто выбросите UnsupportedOperationException ());

Я не знаю, что вы используете случай есть, но в качестве бонуса вы можете также реализовать буферизацию.

10
ответ дан 3 December 2019 в 15:34
поделиться

Как данбен говорит , просто украсьте свой поток и установите ограничение:

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
}
8
ответ дан 3 December 2019 в 15:34
поделиться

Рассмотрите возможность использования http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/LimitInputStream.html

4
ответ дан 3 December 2019 в 15:34
поделиться

Если вам нужно всего 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 ().

2
ответ дан 3 December 2019 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: