2014-11-16 7 views
12

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

That Question is Here

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

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

Если нет, то:

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

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

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

+1

Я не думал, что необходимо отправить любой код. –

+0

Непонятный ответ! Прочтите весь вопрос, пожалуйста. Этот пример не будет компилироваться! –

+1

Код, который записывает эти 44 байта, должен сначала записать в ваш ByteArrayOutputStream. Код не знает, что он пишет в BAOS, достаточно, если он полагается на класс ОС. – eckes

ответ

21

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

а) У вас есть 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); 
... 

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

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

+0

Очень хороший ответ. Спасибо. –

+0

Хммм .... есть что-то о потоках в Java, которые я просто не понимаю. Почему есть OutputStream (который является единственным типом, который может быть записан) и не иметь возможности доступа к данным внутри? Должны ли они НИКОГДА не использоваться в качестве переменной для хранения любых данных, которые будут отправляться позже? Я работаю над аудиопроектом, и большинство вещей, похоже, используют OutputStreams так или иначе. Я нашел некоторый код в API Android, который создает заголовок волнового файла, только заголовок, как OutputStream. –

+0

Подумав об этом, я думаю, вы могли бы добавить OutputStreams для создания данных, которые в конечном итоге будут поступать в InputStream ??? Я буду читать Streams и как правильно их использовать. –

6

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

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

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

+0

Я попробую. –

+0

Я отредактировал свой комментарий. :) Спасибо! Я попробую это. –

+2

нет, это будет писать «ничего» (бос пуст) до oos. – eckes

-1

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

Для получения дополнительной информации вы можете найти ответ Convert InputStream to byte array in Java.

+0

OP хочет создать ByteArrayOutputStream из OutputStream, вы используете InputStream! – Charlie

+3

Регулярные выходные потоки не имеют метода bybytearray. –

+0

Я просмотрел этот https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html, где он показывает методByteArray. Пройдите его один раз. – cauchy

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