黑马程序员技术交流社区

标题: FileOutputStream自定义数组拷贝和ByteArrayOutputStream拷贝哪个更快? [打印本页]

作者: 赵茹艳    时间: 2012-5-15 12:22
标题: FileOutputStream自定义数组拷贝和ByteArrayOutputStream拷贝哪个更快?
用自定义数组拷贝一个文件。

public static void main(String[] args) throws IOException {
                FileInputStream fis = new FileInputStream("004.jpg");               
                FileOutputStream fos = new FileOutputStream("dest.jpg");
               
                byte[] buffer = new byte[1024];                                // 定义byte[]用来存储数据
                int len;                                                                        // 定义int变量用来记住有效数据的个数
                while ((len = fis.read(buffer)) != -1)                // 一次读取buffer.length个数据, 将数据存在buffer中, len记住个数. 如果没遇到文件末尾, 进入循环
                        fos.write(buffer, 0, len);                                // 将数组中的数据从0号索引开始, 写出len个
               
                fis.close();
                fos.close();
        }
用ByteArrayOutputStream拷贝一个文件
private static void demo4() throws FileNotFoundException, IOException {
                FileInputStream fis = new FileInputStream("004.jpg");
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fis.read(buffer)) != -1)
                        baos.write(buffer, 0, len);                        // 将文件中的所有数据都写到内存中
                fis.close();
                baos.close();
               
                byte[] data = baos.toByteArray();                // 获取文件数据
                FileOutputStream fos = new FileOutputStream("dest2.jpg");
                fos.write(data);                                                // 一次性写出所有数据
                fos.close();
        }

这两种方法哪个快,为什么啊?以后工作中哪个更常用?
作者: 云惟桉    时间: 2012-5-15 22:59
while ((len = fis.read(buffer)) != -1)
                        baos.write(buffer, 0, len);                        // 将文件中的所有数据都写到内存中
                fis.close();
                baos.close();
               
                byte[] data = baos.toByteArray();                // 获取文件数据
                FileOutputStream fos = new FileOutputStream("dest2.jpg");
                fos.write(data);                                                // 一次性写出所有数据
                fos.close();

ByteArrayOutputStream这个流没有用过因此不是很了解,但是我有问题就是:
楼主用baos.close关闭该流以后,还可以使用 byte[] data = baos.toByteArray();               
把数据转到字节数组里面去吗?这样不会报错吗?
按理来说关流以后就不能对流进行操作了才对吧
作者: 刘_浩    时间: 2012-5-15 23:04
这个问题可以这样做,前后各写一个System.currentTimeMillis() ;相减就行了。

作者: Fc10232    时间: 2012-5-15 23:38
{:soso_e179:}
作者: 王杰    时间: 2012-5-16 08:20
这个到底用哪个,主要看你的目的是什么,如果是硬盘就用FileOutputStream,如果是内存就用ByteArrayOutputStream,如果是控制台就是System.out。。。
如果考虑到性能的问题,那么你可以使用缓冲区Buffered。将你的输入流和输出流装饰一下就行了。

作者: 永恒之翼网络    时间: 2012-5-16 09:39
就楼主这道题来说,应该是第一种块一些。原因有一下几方面:
一、流操作的对象是“004.jpg”,是硬盘上的,不是内存上的,字节流比字节数组流有优势。
二、第一种用了一个缓冲,而第二种用了三个缓冲。这样同样的数据,第二种操作时,所花的步骤多,因此,所花的时间多。
三、第二种比第一种多用了一个字节数组流,这样使得对同一数据操作时,第二种所花的步骤多,因此,所花的时间多。
上个图:

流的使用.jpg (178.7 KB, 下载次数: 94)

流的使用.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2