以下是在处理之前将整个文件读入内存的三种方法:
方法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在评论中提出的问题:
没有用于随机访问的通用接口。你错了您至少可以礼貌地学习基础知识:http://docs.oracle.com/javase/tutorial/essential/io/
再次说明,基本知识涵盖了这些内容(请参见上文)。使用ByteArrayInputStream,您需要一个byte []来保存整个流。那怎么不受记忆的限制呢? (甚至更糟的是,它也受最大数组大小的限制)。
我不知道该说些什么。你错了撇开它们都扩展InputStream的基本事实,并以某种方式在内部使用字节数组(从技术上讲,任何一种都可以在不使用任何数组的情况下实现,这只是最自然的方式)。他们没有共同之处。 BufferedStream包含另一个流的一小部分动态部分。 ByteArrayInputStream在2中进行了介绍。
建议:这里的人们将很乐意为您建议使用哪种工具来完成哪项工作。但是不要指望汤匙进食。付出一些努力,stackoverflow并不是一个辅导站点。停止“思考”并开始“学习”-这些教程自那门语言诞生以来就已经存在。
关于java - BufferedInputStream与ByteArrayInputStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18291074/