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

7

我正在为一项服务的客户设计API,该服务以字节流的形式检索数据。使用HTML标记的优点是什么?

InputStream getData(String param1, String param2);

结束

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

返回结果:

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

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

如何设计最好? 我甚至考虑使用

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

但是这使得方法名不够直观。


数据的平均大小是多少? - Emmanuel Bourg
数据大部分在几千字节左右,有时在几百千字节,极少情况下会达到几兆字节……数据并不是非常庞大……主要是文本,有时包含图像,很少包含视频。 - subodh
1
客户端在数据部分传输时能否使用任何有用的信息,还是必须等待所有数据传输完毕? - DNA
不,他们需要等待整个数据,因为通常这是需要显示的内容。 - subodh
我认为byte更好,因为你必须关闭流。如果出于性能原因需要流,我认为使用一个“危险”名称的方法可能更好,例如getDataUnsafe,不确定。 - Francesco Belladonna
2个回答

7

byte[]有两个潜在的缺点:

  • 你必须一次性将所有内容存储在内存中,如果要操作大量的数据可能会出问题。
  • 使用您的类的用户必须等待所有数据可用,不能在部分数据可用时立即开始处理。如果网络速度较慢,则这可能是一个显著的劣势。

使用流可以解决这些问题。这取决于您返回的数据以及您希望用户如何使用它。


我大多数情况下希望用户获取并显示它,但是我们想要构建一个通用的API,它不仅限于当前的用例。 - subodh
你考虑过提供两种方法吗? - ARRG
是的...但我必须给它们命名不同,因为它们的返回类型不同,尽管它们实际上做相同的事情。 - subodh

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

是的,这是一种好的技巧,我可以用一个类来包装输入流,并在到达末尾时记得关闭它。 - subodh
InputSupplier现在已经弃用 - Chadi
自从14版本以后,Guava提供了ByteSourceCharSource来替代已弃用的InputSupplier。请参考ByteSourceCharSource - kapex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接