BufferedInputStream与ByteArrayInputStream

时间:2013-08-17 16:39:16

标签: java file-io inputstream

在处理文件之前,有三种方法可以将整个文件读入内存:

方法A:

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[]

1 个答案:

答案 0 :(得分:2)

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

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

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

编辑:回应IUnknown在评论中提出的问题

1 在随机访问的情况下采用什么方法 - 我认为即使在这种情况下BufferedInputStream也是首选解决方案?

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

2 可处理流的大小不受可用堆内存的限制 - 缓冲区必须有一个限制。你是说内部数组在读取时填充时会自动重新调整大小吗?

再次,基础知识涵盖了这些(见上文)。使用ByteArrayInputStream,您需要一个byte []来保存整个流。怎么受内存限制? (更糟糕的是,它也受到最大阵列尺寸的限制)。

3 Buffered流和ByteArray流之间的缓冲行为有什么不同 - 我认为它们是由类似的缓冲行为备份的

我不知道该说些什么。你错了。抛开基本事实,它们都扩展了InputStream,并在某种程度上在内部使用了一个字节数组(技术上要么可以在不使用任何数组的情况下实现,它只是最自然的方式)。他们共有 nothing 。 BufferedStream包含另一个流的一小部分动态。 ByteArrayInputStream包含在2中。

建议:此处的人们很乐意为您提供哪种工具用于哪项工作。但不要指望用勺子喂食。显示一些工作,stackoverflow不是辅导网站。停止“思考”并开始“学习” - 教程就在那里,并且自语言出现以来就一直存在。