Должен ли открытый метод API возвращать InputStream или byte [] - PullRequest
5 голосов
/ 22 февраля 2012

Я разрабатываю API для клиента службы, которая извлекает данные в виде потока байтов.В чем преимущество использования

InputStream getData(String param1, String param2);

перед

byte[] getData(String param1, String param2);

Метод, который возвращает входной поток, беспокоит меня, потому что

  1. теперь мой код должен зависеть отвнешний код для закрытия входного потока.Я знаю, что рекомендуется закрывать только те ресурсы, которые вы открываете, поэтому это кажется неправильным.
  2. Входной поток не повторяется.Как только клиент моего кода читает поток, байты теряются
  3. Поток в моей реализации фактически находится в сети (сокет).Хотя я использую пул соединений и отслеживаю его, чтобы избавиться от просроченных соединений и т. Д., Я чувствую, что было бы лучше иметь возможность закрывать ресурсы, которые я сам открыл.

Какой лучший способ создать это?Я даже подумывал об использовании

void writeData(String param, String param, OutputStream os);

, но это делает имя метода неинтуитивным.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

byte [] имеет два возможных недостатка:

  • Вы должны хранить все в памяти одновременно - что может быть проблематично, если вы манипулируете большим количеством данных.
  • Пользователям вашего класса придется подождать, пока будут доступны все данные - невозможно начать обработку, как только появятся некоторые данные.Это может быть существенным недостатком, если сеть работает медленно.

Использование потока может решить эти проблемы.Это зависит от того, какие данные вы возвращаете, и что вы ожидаете от пользователей делать с ними.

3 голосов
/ 22 февраля 2012

Я бы вернул что-то вроде InputSupplier<InputStream> в Guava, что позволяет вам запрашивать несколько разных входных потоков.

Кроме того, Guava предоставляет ряд методов, которые принимают InputSupplier<InputStream>, открывают входной поток, выполняют какую-либо операцию с целым потоком, а затем закрывают ее, не заставляя вас не забывать закрывать входной поток или что-то подобное.

Даже если вы не хотите использовать Guava напрямую, это хорошая техника, которая позволяет клиентской программе решать, как с ней работать.

...