Преобразовать 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.