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

khbbv19g  于 5个月前  发布在  Java
关注(0)|答案(2)|浏览(54)

我正在为一个服务的客户机设计API,该服务将数据作为字节流进行检索。

InputStream getData(String param1, String param2);

字符串
超过

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


返回inputstream的方法让我很困扰,因为
1.现在我的代码必须依赖外部代码来关闭inputstream。我知道最好的做法是只关闭那些你打开的资源,所以这似乎是错误的。
1.输入流是不可重复的。一旦我的代码的客户端读取流,字节就会丢失
1.在我的实现中,流实际上是通过网络(套接字)的。当我使用连接池并监视它以摆脱过期的连接等时,我觉得能够关闭我自己打开的资源可能会更好。
最好的设计方法是什么?我甚至考虑过用

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


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

a1o7rhls

a1o7rhls1#

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

  • 你必须一次将所有东西都存储在内存中--如果你操作大量数据,这可能会有问题。
  • 您的类的用户将不得不等待所有数据可用-不可能在某些数据可用时立即开始处理。如果网络速度较慢,这可能是一个显著的缺点。

使用流可以解决这些问题,这取决于你返回什么数据以及你希望用户用它做什么。

shstlldc

shstlldc2#

我会返回类似于Guava的InputSupplier<InputStream>,它允许您请求多个不同的输入流。
此外,Guava提供了许多方法,这些方法采用InputSupplier<InputStream>,打开输入流,执行一些完整的流操作,然后关闭它,而不会让您记住关闭输入流或其他东西。
即使您不想直接使用Guava,这也是一种很好的技术,可以让客户端程序决定如何处理它。

相关问题