Java方法返回文件数据,输入流或字节数组,哪个更好?

我需要加载许多文件路径小于1MB的二进制文件,如下所示:loadFile(String path); 它应该返回byte []还是Inputstream? 我认为返回byte []将占用大量内存,我不知道如何返回ByteArrayInputStream或事件FileInputream,因为我不知道何时关闭InputStream。 谢谢。

两种选择都有陷阱:

  • Streams是有状态的。 您必须在注释中描述行为,但不能以编程方式约束某些内容,例如:在返回流实例之前已经读取了多少字节。 此外,当使用Streams作为返回值或方法参数时,不清楚谁负责关闭流。 我通常会尽可能避免使用Streams作为返回值或方法参数。
  • byte[]强制您将所有内容存储在内存中。 对于小东西来说这可能没问题,但它不能很好地扩展。 此外,arrays是可变的,这是有问题的。 您必须使用防御性副本(对于大量数据而言可怕)或者您打破封装,因为您可以从外部更改返回的可变数组。

我的建议是在需要在方法调用之间解雇时使用Suppliers来获取资源。 在这种特殊情况下,我会使用Guava ByteSource 。

当没有必要像这样发射这样的东西时,就像Michael Wilkowski发布它一样。

最好使用输入流而不是数组(无论如何都要在内部使用输入流)。 最佳实践是现在使用新Java中可用的Closeablefunction,它在离开try(){}子句后自动关闭输入流,即:

 try (FileInputStream fi = new FileInputStream(new File(path))) { //...reading code comes here } 

那么,首先,您应该学习如何关闭inputStream,它并不难:

 inputStream.close(); 

也就是说,使用InputStreamsbyte[]实际上取决于您的应用程序。

一个通用的解决方案当然是使用inputStreams (这样, 你可以决定稍后将它们完全加载或放在块上)但是如果你总是将读取数据作为一个整体使用(例如,读取位图),你的函数是自包含的并且返回整个字节数组没有任何问题。