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

单曲循环shield 发布于 2017/02/15 16:02
阅读 383
收藏 0

源代码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();
以上两个程序有什么性能上的区别吗?
 

加载中
0
战争总会来临
战争总会来临

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

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

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

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

引用来自“单曲循环shield”的评论

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

2048我也用啊。。。这不就是1k 2k么,按buffer读取写入的时候,最好是这种2的倍数吧,要不跨页还会影响一点性能(猜的),毕竟内存一页一般也就是4K。

1
战争总会来临
战争总会来临

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

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

0
单曲循环shield
单曲循环shield

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

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

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

0
ksfzhaohui
ksfzhaohui

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

返回顶部
顶部