Преобразовать OutputStream в ByteArrayOutputStream

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

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

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

Есть ли простой тип кастинга или что-то такое, что позволит это?

Если нет, то:

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

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

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

3 ответа

Решение

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

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

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

б) если у вас есть какой-либо другой тип выходного потока, на самом деле не имеет смысла конвертировать его в 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 (который вы не знаете, что это такое, например, потому что вы получаете это из сервлета), то нет способа вернуть эту информацию. Вы не должны писать то, что вам нужно позже. Решением является ответ б) где вы пишете его в своем собственном потоке, а затем вы можете использовать массив для своих собственных целей, а также записать его в фактический выходной поток.

Помните, что ByteArrayOutputStreams хранит все данные в памяти.

Вы могли бы использовать writeTo метод ByteArrayOutputStream,

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

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

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

Более подробно вы можете посмотреть ответ Convert InputStream в байтовый массив в Java.

Другие вопросы по тегам