Использование (имитация?) произвольного доступа в AudioInputStream
такое же, как и в обычном InputStream
. Вы можете создать mark()
в начале файла, то есть до того, как будут выполнены какие-либо вызовы read()
. Затем, когда вы хотите сделать произвольный доступ, вы прекращаете чтение из потока, переходите к позиции маркера, вызывая reset()
, а затем используйте skip()
, чтобы перейти в нужное место.
Обратите внимание, что начальная «метка» по умолчанию будет равна 0 для AudioInputStream
, поэтому первоначальный вызов не требуется. Однако это поведение не указано, поэтому оно может измениться в будущем.
Реализация AudioInputStream
(Oracle Java 8) поддерживает этот механизм, если базовый поток (например, InputStream
, который вы передаете конструктору) поддерживает его. Вы можете узнать, поддерживает ли AudioInputStream
его, позвонив markSupported()
.
К сожалению, при использовании служебных функций из AudioSystem
для создания AudioInputStream
вы не можете влиять на базовый поток. Это может даже отличаться для каждой платформы. Если ваш поток не поддерживает его (или вы хотите быть абсолютно уверены, что он его поддерживает), вы можете создать новый AudioInputStream
, заключив его в файл BufferedInputStream
. Например вот так:
AudioInputStream normalStream = AudioSystem.getAudioInputStream(...);
AudioInputStream bufferedStream = new AudioInputStream(new BufferedInputStream(normalStream),
normalStream.getFormat(), AudioSystem.NOT_SPECIFIED);
Отказ от ответственности: я бы назвал это «взломом» для создания произвольного доступа. К моему удивлению, я мало что нашел о моделировании произвольного доступа с использованием механизма пометки/сброса в InputStream
. Это может быть связано с тем, что в этом есть оговорка. Изменить: John Skeet согласен со мной в этом подходе.
person
Thirler
schedule
04.06.2015