我需要加载许多文件路径小于1MB的二进制文件,如下所示:loadFile(String path); 它应该返回byte []还是Inputstream?我认为返回byte []会占用大量内存,而且我不知道如何返回ByteArrayInputStream或事件FileInputream,因为我不知道何时关闭InputStream。 感谢。
答案 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();
也就是说,使用InputStreams
或byte[]
实际上取决于您的申请。
一个通用的解决方案肯定是使用inputStreams
(这样,你以后决定更好地加载它或在块上加载它)但是如果你愿意的话总是使用读取数据作为一个整体(例如,读取位图),你的函数是自包含的并且返回整个字节数组没有错。