2015-04-21 2 views
0

Мне нужно вернуть массив байтов для ByteArrayOutputStream из вызываемого метода. Я вижу два способа добиться того же: сначала вернуть ByteArrayOutputStream & toByteArray() метод, а во-вторых использовать baos.toByteArray() и вернуть массив байтов.java: Возвращаемый поток или результирующие байты

Какой я должен использовать?

Чтобы проиллюстрировать на примере:

Метод 1

void parentMethod(){ 
     bytes [] result = process(); 
    } 
    void byte[] process(){ 
     ByteArrayOutputStream baos; 
     ..... 
     ..... 
     ..... 
     baos.toByteArray(); 
    } 

Метод 2

void parentMethod(){ 
     ByteArrayOutputStream baos = process();  
    } 
    void ByteArrayOutputStream process(){ 
     ByteArrayOutputStream baos; 
     ..... 
     ..... 
     ..... 
     return baos; 
    } 
+1

Учитывая, что 'parentMethod()' не нужно беспокоиться о том, как он получил байты, возврат 'byte []' кажется лучше. –

ответ

2

Там другая альтернатива: вернуть InputStream. Предполагается, что вы возвращаете данные, полученные в результате операции. Таким образом, возвращение выход поток кажется очень странным для меня. Чтобы вернуть данные, вы обычно возвращаете необработанный byte[] или обертываете его InputStream - последний более гибкий, поскольку он может считывать из файла или что-то подобное, но требует, чтобы вызывающий абонент закрывал поток позже.

Отчасти это зависит от того, какие звонящие хотят делать с данными, - есть некоторые операции, которые легче выполнить, если у вас уже есть поток; есть другие, которые проще с байтовым массивом. Я бы позволил этому влиять на решение довольно много.

Если вы сделать хотите вернуть поток, который легко:

return new ByteArrayInputStream(baos.toByteArray()); 

Итак, подведем итог:

  • Не возвращайте ByteArrayOutputStream. Использование этого класса при составлении данных является детальностью реализации, и это не является логическим результатом операции.
  • Рассмотрите возможность возврата InputStream, если вызывающие абоненты, скорее всего, найдут это более простым в использовании, или если позже вам захочется прочитать данные из файла (или сетевого подключения или что-то еще); ByteArrayInputStream подходит для текущей реализации