首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferInputStream vs ByteArrayInputStream

BufferInputStream vs ByteArrayInputStream
EN

Stack Overflow用户
提问于 2013-08-18 00:39:16
回答 1查看 12.3K关注 0票数 3

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

方法A:

代码语言:javascript
复制
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);

方法B:

代码语言:javascript
复制
ByteArrayInputStream bi =
    new ByteArrayInputStream(
        org.apache.commons.io.FileUtils.readFileToByteArray(file))

方法C:

代码语言:javascript
复制
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[]呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-18 01:06:48

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

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

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

EDIT:回答@IUnknown在评论中提出的问题:

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

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

  1. 可处理流的大小不受可用堆内存的限制-缓冲区必须有一个limit.Are您说,如果内部数组在读取时填满,则会自动调整其大小?

同样,这是在基础知识中涵盖的(见上)。对于ByteArrayInputStream,您需要一个byte[]来容纳整个流。这怎么能不受内存的限制呢?(更糟糕的是,它还受到最大数组大小的限制)。

  1. 在缓冲流和ByteArray流之间的缓冲行为是否有区别-我认为它们是由相似的缓冲行为

支持的

我不知道说什么才好。你想错了。抛开基本事实不谈,它们都扩展了InputStream,并以某种方式在内部使用了字节数组(从技术上讲,这两种方法都可以在不使用任何数组的情况下实现,这是最自然的方式)。他们没有任何共同之处。一个BufferedStream保存另一个流的一小部分动态内容。ByteArrayInputStream在2中进行了介绍。

建议:这里的人员会很高兴地建议您使用哪种工具来完成哪项工作。但不要期望被灌输。表现出一些努力,stackoverflow不是一个辅导网站。停止“思考”,开始“学习”--从语言诞生之日起,教程就已经存在了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18291074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档