Поиск ByteArrayInputStream с использованием java.io - PullRequest
10 голосов
/ 25 сентября 2010

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

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

РЕДАКТИРОВАТЬ: Я нашел один способ добиться того, что я пытаюсь сделать, но это немного грязно.ImageIO.createImageInputStream создает ImageInputStream, что именно то, что я хочу (могу искать и читать примитивы).Однако использование ByteArrayInputStream возвращает FileCacheImageInputStream, что в основном означает, что он копирует байтовый массив в файл просто для поиска.

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

Ответы [ 3 ]

10 голосов
/ 25 сентября 2010

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

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

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

4 голосов
/ 25 сентября 2010

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

1 голос
/ 25 сентября 2010

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

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

...