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

时间:2012-02-21 22:49:39

标签: java api bytearray httpclient inputstream

我正在为服务的客户端设计API,该服务以字节流的形式检索数据。 使用

有什么好处
InputStream getData(String param1, String param2);

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

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

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