Несмотря на то, что вы, конечно, можете использовать ArrayList для этого, вы в значительной степени смотрите на издержки памяти в 4-8 раз - предполагая, что байты не выделяются заново, а совместно используют один глобальный экземпляр (так как это верно для целых чисел, я предполагаю, что это работаети для байтов) - и вы потеряете всю локальность кэша.
Таким образом, хотя вы можете создавать подклассы ByteArrayOutputStream, но даже там вы получаете накладные расходы (методы синхронизируются), которые вам не нужны.Так что я бы лично развернул свой собственный класс, который динамично растет, когда вы пишете в него.Менее эффективный, чем ваш текущий метод, но простой, и мы все знаем часть с амортизированными затратами - в противном случае вы, очевидно, также можете использовать свое решение.Пока вы оборачиваете решение в чистый интерфейс, вы скрываете сложность и все равно получаете хорошую производительность
Или иным образом сказано: нет, вы не можете сделать это более эффективно, чем уже естьи каждая встроенная коллекция Java должна работать хуже по той или иной причине.