【问题标题】:Java method return file data, inputstream or byte array, which is better? [closed]Java方法返回文件数据,输入流还是字节数组,哪个更好? [关闭]
【发布时间】:2014-12-04 23:44:26
【问题描述】:

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

【问题讨论】:

  • 这是只有程序员才能做出的决定。
  • 你想用你加载的数据做什么
  • 直接返回 ByteArrayInputStreambyte[] 数组在内存方面是一样的。 ByteArrayInputStream 简单地包装了一个数组并允许您像流一样访问它。

标签: java inputstream


【解决方案1】:

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

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

【讨论】:

  • 嘿,您使用的是 Java 7... 因此try (InputStream in = Files.newInputStream(Paths.get(path)))
  • 你是对的。我已经习惯了智能感知,不记得确切的方法和构造函数:)
  • 对不起,我英语不好。我应该使用更多的代码在每个 fileReader 方法中读取文件并在当前方法中关闭文件,而不应该只为每个 fileReader 方法调用一体化方法“ByteArrayInputStream loadFile(String path)”。我的英语...--!
【解决方案2】:

这两个选项都有缺陷:

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

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

如果没有必要解雇这样的事情,那么就按照 Michael Wilkowski 发布的方式去做。

【讨论】:

  • 赞成“....当没有必要解雇这样的事情时,就按照 Michael Wilkowski 发布的方式去做。”
【解决方案3】:

嗯,首先,你应该学会如何关闭一个inputStream,一点都不难:

inputStream.close();

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

一刀切的解决方案当然是使用inputStreams(这样,您稍后会决定是完全加载还是分块加载)但如果您总是使用 read数据作为一个整体(例如,读取位图),你的函数是独立的并返回整​​个字节数组没有任何问题。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2020-02-13
    • 2021-06-09
    • 2010-10-12
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多