2010-09-25 2 views
10

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

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

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

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

+0

Вы видите какую-либо проблему с использованием 'seek'? –

+4

@Vilay Mathew: Какой метод 'seek'? Я не вижу в ByteArrayInputStream. – asdfghjkl

+0

Файл i/o в java - огромный беспорядок. Я преподаю это первокурсникам и стараюсь сделать это простым, но это всегда путаница. – Fixee

ответ

8

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

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

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

+0

Если знак не вызывается, значение по умолчанию для отмеченной позиции равно 0, поэтому вызов reset перемещает указатель на 0, а затем пропускает функцию, перемещает указатель на заданную позицию. –

+0

@SumitKumarSaha: Да ... Я не уверен в том, что ваш комментарий. –

+0

Я просто добавлял ваш ответ –

1

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

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

4

Если вы создаете ByteArrayInputStream пройти в другом месте, расширить класс и манипулировать posprotected член ByteArrayInputStream), как вы хотите.

Смежные вопросы