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

时间:2014-12-04 23:44:27

标签: java inputstream

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

这两个选项都有陷阱:

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

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

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

答案 2 :(得分:0)

嗯,首先,您应该学习如何关闭inputStream,它根本不难:

inputStream.close();

也就是说,使用InputStreamsbyte[]实际上取决于您的申请。

一个通用的解决方案肯定是使用inputStreams(这样,你以后决定更好地加载它或在块上加载它)但是如果你愿意的话总是使用读取数据作为一个整体(例如,读取位图),你的函数是自包含的并且返回整个字节数组没有错。

相关问题