Java 公共API方法是否应返回InputStream或byte[]

Java 公共API方法是否应返回InputStream或byte[],java,api,bytearray,httpclient,inputstream,Java,Api,Bytearray,Httpclient,Inputstream,我正在为以字节流形式检索数据的服务的客户端设计API。 使用的好处是什么 InputStream getData(String param1, String param2); 结束 返回inputstream的方法让我感到困扰,因为 现在,我的代码必须依靠外部代码来关闭inputstream。我知道,最好的做法是只关闭您打开的资源,因此这似乎是错误的 输入流不可重复。一旦我的代码的客户端读取流,字节就会丢失 我的实现中的流实际上是通过网络(套接字)的。当我使用连接池并监视它以清除过期的连接时,

我正在为以字节流形式检索数据的服务的客户端设计API。 使用的好处是什么

InputStream getData(String param1, String param2);
结束

返回inputstream的方法让我感到困扰,因为

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

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

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

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

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

    使用流可以解决这些问题。这取决于您要返回的数据以及您希望用户对其执行的操作。

    我将返回类似于Guava的
    InputSupplier
    ,它允许您请求多个不同的输入流

    此外,Guava还提供了许多方法,这些方法采用
    InputSupplier
    ,打开一个输入流,执行一些完整的流操作,然后关闭它,而不会让您记住关闭输入流或其他任何东西


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

    数据的平均大小是多少?数据大多以Kbs为单位,有时是以100s为单位,在极少数情况下会有一些Mb。。。数据并不是很大。。大部分是文本,有时是图像,很少是视频。客户端可以对部分数据做任何有用的处理(当它被传输时),或者他们需要等待整个数据吗?不,他们需要等待整个数据,因为它通常是需要显示的内容,我认为字节更好,只是因为您必须关闭流,否则。如果出于性能原因需要流,我认为使用“危险”名称的方法应该更好,可能是GetDataSafe,dunno。我主要希望用户使用它并显示它,但我们希望构建一个通用api,它不特定于当前用例。您考虑过提供两种方法吗?是的。。。但是我必须对它们进行不同的命名,因为当它们实际执行相同的操作时,它们的返回类型是不同的。是的,这是一种很好的技术,我可以使用一个类来包装输入流,该类在输入流到达endInputSupplier时会记得关闭它。而不是不推荐的
    InputSupplier
    ,番石榴从第14版开始提供。
    void writeData(String param, String param, OutputStream os);