Поиск ByteArrayInputStream с использованием java.io

Как я могу найти (изменить положение) ByteArrayInputStream (java.io)? Это настолько очевидно, но я не могу найти способ для этого где-нибудь (mark/reset недостаточно, мне нужно установить положение в любом месте на InputStream).

Если это невозможно сделать с помощью java.io, и я должен переключиться на java.nio и использовать ByteBuffer, как я могу получить что-то похожее на DataOutputStream обертку ByteArrayOutputStream с помощью java.nio? Я не нахожу какой-либо буфер с автоматическим изменением размера.

EDIT: Я нашел один способ добиться того, что я пытаюсь сделать, но это немного грязно. ImageIO.createImageInputStream создает ImageInputStream, что именно то, что я хочу (можно искать и читать примитивы). Однако использование ByteArrayInputStream возвращает a FileCacheImageInputStream, что в основном означает, что он копирует массив байтов в файл только для поиска.

Это мой первый раз, когда я пытаюсь использовать классы Java IO, и он был полностью отрицательным. В нем отсутствуют некоторые основные функции (IMO), и у него есть много способов сделать то же самое (например, для чтения примитивов из файла вы можете использовать RandomAccessFile, DataInputStream + FileInputStream, FileImageInputStream, FileChannel + ByteBuffer и, возможно, даже больше).

Ответ 1

Вы использовали бы reset()/skip(). Я не могу сказать, что это самый красивый API в мире, но он должен работать:

public void seek(ByteArrayInputStream input, int position)
    throws IOException
{
    input.reset();
    input.skip(position);
}

Конечно, предполагается, что никто не вызвал mark().

Ответ 2

Если вы создаете ByteArrayInputStream для перехода в другое место, расширьте класс и манипулируйте pos (a protected членом ByteArrayInputStream) по своему желанию.

Ответ 3

Существует конструктор ByteArrayInputStream(byte(), int, int), который даст вам поток ввода, который будет считываться с заданным количеством байтов, начиная с заданного смещение. Вы можете использовать это для имитации поиска произвольного смещения в потоке.

Вам нужно иметь дело с тем, что "поиск" дает вам новый объект потока, и это может быть неудобно. Однако этот подход не предполагает копирование каких-либо байтов или сохранение их в файл, и не следует беспокоиться о закрытии объектов ByteArrayInputStream.