Преобразование OutputStream в ByteArrayOutputStream

Я пытаюсь преобразовать поток OutputStream в поток ByteArrayOutput. Я не смог найти четких простых ответов о том, как это сделать. Этот вопрос задавался в заголовке вопроса о StackOverflow, но в теле вопроса спрашивают, как изменить ByteArrayStream на OuputStream. У меня есть OutputStream, который уже создан, и этот пример, указанный в ответе, не будет компилироваться!

Этот вопрос здесь

У меня есть OutputStream, который уже сконструирован и имеет длину 44 байта, называемую waveHeader. Я хочу преобразовать это в ByteArrayOutputStream, потому что я хочу иметь возможность изменить это в байт [] с помощью waveHeader.ToByteArray() для простоты в последующих процессах;

Есть ли простой способ литья или что-то, что позволит это?

Если нет, то:

  • Есть ли способ создать указатель на данные в исходном OutputStream, если его невозможно преобразовать?

  • Как кто-то будет обращаться к данным, содержащимся в OutputStream?

Я новичок в JAVA. Это всего лишь хобби для меня. Потоки В VisualBasic.net куда проще!

Ответ 1

Существует несколько возможных сценариев:

a) У вас есть ByteArrayOutputStream, но он был объявлен как OutputStream. Затем вы можете сделать такой бросок:

void doSomething(OutputStream os)
{
    // fails with ClassCastException if it is not a BOS
    ByteArrayOutputStream bos = (ByteArrayOutputStream)os;
...

b), если у вас есть какой-либо другой выходной поток, на самом деле нет смысла преобразовывать его в BOS. (Обычно вы хотите использовать его, потому что хотите получить доступ к массиву результатов). Таким образом, в этом случае вы просто настраиваете новый поток и используете его.

void doSomething(OutputStream os)
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bos.write(something);
    bos.close();
    byte[] arr = bos.toByteArray();
    // what do you want to do?
    os.write(arr); // or: bos.writeTo(os);
...

c) Если вы что-то написали в любом виде OutputStream (который вы не знаете, что это такое, например, потому что вы получаете его из сервлета), нет способа вернуть эту информацию. Вы не должны писать то, что вам нужно позже. Решением является ответ b), где вы пишете его в своем потоке, а затем вы можете использовать массив для своей собственной цели, а также записывать его в фактический выходной поток.

Имейте в виду, что ByteArrayOutputStream сохраняют все данные в памяти.

Ответ 2

Вы можете использовать метод writeTo ByteArrayOutputStream.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes = new bytes[8];
bos.write(bytes);
bos.writeTo(oos);

Вы можете создать экземпляр ByteArrayOutputStream. Затем вам нужно записать данные в этот ByteOutputStream экземпляр, а затем с помощью метода writeTo, который принимает OutputStream, вы можете включить ByteArrayOutputStream для записи вывода в экземпляр OutputStream, который вы как аргумент.

Ответ 3

Вы можете использовать функцию toByteArray в потоке вывода, который у вас есть. Можно сказать, что у вас есть буфер outputStream. Таким образом, вы можете сделать buffer.toByteArray.

Подробнее вы можете найти ответ Преобразовать InputStream в байтовый массив в Java.