在处理文件之前,有三种方法可以将整个文件读入内存:
方法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[]
?
答案 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不是辅导网站。停止“思考”并开始“学习” - 教程就在那里,并且自语言出现以来就一直存在。