公共API方法应该返回InputStream还是byte []

sub*_*odh 5 java api bytearray inputstream httpclient

我正在为服务的客户端设计API,该服务以字节流的形式检索数据.使用的优点是什么

InputStream getData(String param1, String param2);
Run Code Online (Sandbox Code Playgroud)

过度

byte[] getData(String param1, String param2);
Run Code Online (Sandbox Code Playgroud)

返回输入流的方法困扰我,因为

  1. 现在我的代码必须依赖外部代码来关闭输入流.我知道最好只关闭那些打开的资源,这似乎是错误的.
  2. 输入流不可重复.一旦我的代码的客户端读取流,字节就会丢失
  3. 我实现中的流实际上是通过网络(套接字).当我使用连接池并监视它以摆脱过期的连接等时,我觉得能够关闭我自己打开的资源可能会更好.

设计这个的最佳方法是什么?我甚至考虑过使用

void writeData(String param, String param, OutputStream os);
Run Code Online (Sandbox Code Playgroud)

但这使得方法名称不直观.

ARR*_*RRG 5

byte []有两个可能的缺点:

  • 您必须立即将所有内容存储在内存中 - 如果您正在操作大量数据,这可能会有问题.
  • 您班级的用户必须等待所有数据可用 - 一旦有些数据可用,就无法开始处理.如果网络很慢,这可能是一个显着的缺点.

使用Stream可以解决这些问题.这取决于您返回的数据以及您希望用户使用它做什么.


Lou*_*man 2

我会返回类似 Guava 的东西InputSupplier<InputStream>,它可以让您请求多个不同的输入流。

此外,Guava 提供了许多方法,这些方法采用InputSupplier<InputStream>、 打开输入流、执行一些全流操作,然后关闭它,而不会让您记住关闭输入流或其他任何操作。

即使您不想直接使用 Guava,这也是一项很好的技术,可以让客户端程序决定如何处理它。