以下是在处理整个文件之前将其读取到内存中的三种方法:
方法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[]呢?
发布于 2013-08-18 01:06:48
除非您在功能方面需要任何特殊功能(例如随机访问),否则封装到BufferedInputStream中的InputStream是从提供流功能的任何类型的数据源顺序读取的通用选择。
这将提供合理的性能(通过缓冲),代码是通用的,因为它可以处理任何流,而且非常重要-可处理流的大小不受可用堆内存的限制。
因此,除非您有非常令人信服的理由来针对特殊情况API进行编码,否则请使用标准InputStream并根据需要对其进行包装。
EDIT:回答@IUnknown在评论中提出的问题:
没有用于随机访问的通用接口。你想错了。你至少可以这样有礼貌地学习基础知识:http://docs.oracle.com/javase/tutorial/essential/io/
同样,这是在基础知识中涵盖的(见上)。对于ByteArrayInputStream,您需要一个byte[]来容纳整个流。这怎么能不受内存的限制呢?(更糟糕的是,它还受到最大数组大小的限制)。
支持的
我不知道说什么才好。你想错了。抛开基本事实不谈,它们都扩展了InputStream,并以某种方式在内部使用了字节数组(从技术上讲,这两种方法都可以在不使用任何数组的情况下实现,这是最自然的方式)。他们没有任何共同之处。一个BufferedStream保存另一个流的一小部分动态内容。ByteArrayInputStream在2中进行了介绍。
建议:这里的人员会很高兴地建议您使用哪种工具来完成哪项工作。但不要期望被灌输。表现出一些努力,stackoverflow不是一个辅导网站。停止“思考”,开始“学习”--从语言诞生之日起,教程就已经存在了。
https://stackoverflow.com/questions/18291074
复制相似问题