Поиск 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
.