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

方法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[]呢?

最佳答案

除非您在功能方面需要任何特殊功能(例如随机访问),否则将BufferedInputStream封装的InputStream是从具有流功能的任何类型的数据源顺序读取的通用选择。
这将提供合理的性能(通过缓冲),代码具有通用性,因为它可以处理任何流,并且也非常重要-可处理流的大小不受此惯用语的可用堆内存限制。
因此,除非您有非常令人信服的理由针对特殊情况的API进行编码,否则请使用标准InputStream并根据需要包装它。

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

  • 在随机访问的情况下该如何处理-我认为即使在这种情况下,BufferedInputStream还是首选解决方案?

  • 没有用于随机访问的通用接口。你错了您至少可以礼貌地学习基础知识:http://docs.oracle.com/javase/tutorial/essential/io/
  • 可处理流的大小不受可用堆内存的限制-缓冲区必须有限制。您是说内部数组在读取时填满后会自动调整大小吗?

  • 再次说明,基本知识涵盖了这些内容(请参见上文)。使用ByteArrayInputStream,您需要一个byte []来保存整个流。那怎么不受记忆的限制呢? (甚至更糟的是,它也受最大数组大小的限制)。
  • Buffered流和ByteArray流之间的缓冲区行为是否有区别-我认为它们由相似的缓冲区行为
  • 备份

    我不知道该说些什么。你错了撇开它们都扩展InputStream的基本事实,并以某种方式在内部使用字节数组(从技术上讲,任何一种都可以在不使用任何数组的情况下实现,这只是最自然的方式)。他们没有共同之处。 BufferedStream包含另一个流的一小部分动态部分。 ByteArrayInputStream在2中进行了介绍。
    建议:这里的人们将很乐意为您建议使用哪种工具来完成哪项工作。但是不要指望汤匙进食。付出一些努力,stackoverflow并不是一个辅导站点。停止“思考”并开始“学习”-这些教程自那门语言诞生以来就已经存在。

    关于java - BufferedInputStream与ByteArrayInputStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18291074/

    10-10 19:22