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

问题描述 投票:0回答:2

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

InputStream getData(String param1, String param2);

结束

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

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

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

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

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

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

java arrays inputstream api-design java-http-client
2个回答
7
投票

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

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

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


2
投票

我会返回像 Guava 的

InputSupplier<InputStream>
这样的东西,它可以让你请求多个不同的输入流。

此外,Guava 还提供了许多方法,这些方法采用

InputSupplier<InputStream>
,打开输入流,执行一些全流操作,然后关闭它,而不会让您记住关闭输入流或其他任何操作。

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

© www.soinside.com 2019 - 2024. All rights reserved.