3

以下是在处理之前将整个文件读入内存的三种方法:

方法一:

fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);

方法 B:

ByteArrayInputStream bi =
    new ByteArrayInputStream(
        org.apache.commons.io.FileUtils.readFileToByteArray(file))

方法 C:

File file = new File(yourFileName);
RandomAccessFile ra = new RandomAccessFile(yourFileName, "rw"):
byte[] b = new byte[(int)file.length()];
try {
    ra.read(b);
} catch (Exception e) {
    e.printStackTrace();
}

为什么我更喜欢一种方法而不是另一种方法?
是否有任何特定的用例需要一种方法而不是另一种方法?
为什么不使用固定长度byte[]呢?

4

1 回答 1

3

除非您需要任何特殊的功能(例如随机访问),否则包装到 BufferedInputStream 中的 InputStream 是从提供流式传输功能的任何类型的数据源顺序读取的通用选择。

这将提供合理的性能(通过缓冲),代码是通用的,因为它可以处理任何流,而且非常重要 - 可处理流的大小不受此习惯用法可用堆内存的限制。

因此,除非您有非常令人信服的理由针对特殊情况 API 进行编码,否则请使用标准 InputStream 并根据需要对其进行包装。


编辑:针对@IUnknown 评论中提出的问题:

  1. 在随机访问的情况下,我认为 BufferedInputStream 是首选解决方案,即使在这种情况下也是如此?

没有用于随机访问的通用接口。你想错了。你至少可以很有礼貌地学习基础知识:http ://docs.oracle.com/javase/tutorial/essential/io/

  1. 可处理流的大小不受可用堆内存的限制 - 缓冲区必须有限制。你是说如果内部数组在读取时被填满,它会自动重新调整大小吗?

同样,这已涵盖在基础知识中(见上文)。使用 ByteArrayInputStream 您需要一个 byte[] 来保存整个流。怎么不受内存限制?(更糟糕的是,它也受到最大数组大小的限制)。

  1. Buffered 流和 ByteArray 流之间的缓冲区行为是否有任何区别 - 我认为它们是由类似的缓冲区行为支持的

我不知道该说些什么。你想错了。撇开基本事实不谈,它们都扩展了 InputStream 并以某种方式在内部使用字节数组(从技术上讲,两者都可以在不使用任何数组的情况下实现,这只是最自然的方法)。他们没有任何共同之处。BufferedStream 保存另一个流的一小部分动态部分。ByteArrayInputStream 已在 2 中介绍。

建议:这里的人会很乐意为您提供关于使用哪种工具完成哪项工作的建议。但不要指望被勺子喂食。显示一些努力,stackoverflow 不是一个辅导网站。停止“思考”并开始“学习”——教程就在那里,并且从语言诞生之日起就已经存在。

于 2013-08-17T17:06:47.933 回答