将 文件 转换为 字节数组 的两个方法有什么区别吗?

发布于 2021-12-05 02:29:18 字数 1018 浏览 822 评论 6

源代码1:

        InputStream in = new FileInputStream("E:\java编程思想.jpg");
        byte[] data = new byte[in.available()];
        in.read(data);

源代码2:

        InputStream in = new FileInputStream("E:\java编程思想.jpg");
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] data = null;
        byte[] buf = new byte[1024];
        int numBytesRead = 0;
        while ((numBytesRead = in.read(buf)) != -1) {
            output.write(buf, 0, numBytesRead);
        }
        data = output.toByteArray();
以上两个程序有什么性能上的区别吗?
 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

灵芸 2021-12-06 14:44:27

内存映射文件,Filechannel的map()方法,性能应该会更好

恋你朝朝暮暮 2021-12-06 14:41:09

引用来自“战争总会来临”的评论

看你内容够用不。第一个一下申请很多内存,小心OOM;第二个慢一点,更安全。

猫性小仙女 2021-12-06 14:40:53

根据wiki的说法,使用2^N大小的内存,是为了避免产生碎片。我自己曾经使用过64K的空间,来缓存视频文件。

内存从一个2的N次幂大的内存块中分配。当内存块比要分配的长度大两倍以上,内存块平均分裂成两块。选中其中一半,重复这个过程(检查长度,满足条件则分裂)直到内存块刚好等于需要的长度。
所有的块信息保存在一个排序过的链表或者二叉树中。当一个块被释放的时候与他的相邻块进行比较。如果他们都被释放,就合并成一个大块放进更大的一个块列表 中。每当分配结束,分配器会从尽量小的块重新开始分配,以避免产生不必要的碎片。

残花月 2021-12-06 14:40:45

引用来自“战争总会来临”的评论

看你内容够用不。第一个一下申请很多内存,小心OOM;第二个慢一点,更安全。

苍暮颜 2021-12-06 14:33:12

还有  我想问一下为什么一般创建字节数组的长度都是1024,比如这样:new byte[1024],为什么没见过用1000或其他数字的?

睫毛上残留的泪 2021-12-06 08:53:00

看你内容够用不。第一个一下申请很多内存,小心OOM;第二个慢一点,更安全。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文