2012-02-21 8 views
5

Sto progettando l'API per un client di un servizio che recupera i dati come flusso di byte. qual è il vantaggio di utilizzareSe un metodo API pubblico restituisce InputStream o byte []

InputStream getData(String param1, String param2); 

oltre

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

Il metodo che restituisce l'InputStream mi preoccupa perché

  1. ora il mio codice deve dipendere da codice esterno per chiudere l'InputStream . So che è una buona pratica chiudere solo le risorse che apri, quindi questo sembra sbagliato.
  2. L'inputstream non è ripetibile. Una volta che il client del mio codice legge lo stream, i byte vengono persi
  3. Lo stream nella mia implementazione è in realtà sulla rete (socket). Mentre sto usando un pool di connessioni e lo sto monitorando per sbarazzarmi delle connessioni scadute, penso che potrebbe essere meglio riuscire a chiudere le risorse che ho aperto.

Qual è il modo migliore per progettare questo? Ho anche considerato l'utilizzo di

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

ma questo rende il metodo non intuitivo.

+0

Qual è la dimensione media dei dati? –

+0

I dati sono quasi tutti in Kbs A volte in 100s di Kbs e in rari casi saranno alcuni Mb ... i dati non sono davvero enormi .. Per lo più testo e alcune volte immagini e raramente video – subodh

+1

I client possono fare qualsiasi cosa utile con il parziale dati (mentre viene trasmesso in streaming) o devono attendere l'intero dato? – DNA

risposta

3

Mi piacerebbe restituire qualcosa come InputSupplier<InputStream> di Guava, che consente di richiedere più flussi di input distinti.

Inoltre, Guava fornisce una serie di metodi che prendono uno InputSupplier<InputStream>, aprono un flusso di input, eseguono alcune operazioni dell'intero flusso e quindi chiudono senza che si ricordi di chiudere il flusso di input o qualsiasi altra cosa.

Anche se non si desidera utilizzare Guava direttamente, è una buona tecnica che consente al programma client di decidere come gestirlo.

+0

Sì questa è una buona tecnica, potrei avvolgere il flusso di input con una classe che si ricorda di chiuderla quando raggiunge la fine – subodh

+0

InputSupplier è ora [deprecato] (https://google.github.io/guava/releases/19.0/api/docs/com/google/common/io/InputSupplier.html). – Chadi

+0

Invece del deprecato 'InputSupplier', Guava offre [' ByteSource'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/io/ByteSource.html) e ['CharSource'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/io/CharSource.html) dalla versione 14. – Kapep

5

byte [] ha due possibili svantaggi:

  • Dovete memorizzare tutto in memoria in una volta - che potrebbe essere problematico se si stanno manipolando un sacco di dati.
  • Gli utenti della classe dovranno attendere che tutti i dati siano disponibili: non è possibile iniziare l'elaborazione non appena alcuni dati sono disponibili. Questo può essere uno svantaggio significativo se la rete è lenta.

L'utilizzo di un flusso può risolvere questi problemi. Dipende da quali dati stai restituendo e da cosa ti aspetti che gli utenti facciano con esso.

+0

Principalmente mi aspetto che gli utenti lo prendano e lo visualizzino, ma vogliamo creare una API generica che non sia specifica per il caso d'uso corrente – subodh

+0

Hai considerato di fornire due metodi? – ARRG

+0

sì ... ma dovrei chiamarli in modo diverso perché i loro tipi di ritorno sono diversi quando fanno effettivamente la stessa cosa – subodh