A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

用自定义数组拷贝一个文件。

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();
        }

这两种方法哪个快,为什么啊?以后工作中哪个更常用?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

5 个回复

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

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

流的使用.jpg

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
这个到底用哪个,主要看你的目的是什么,如果是硬盘就用FileOutputStream,如果是内存就用ByteArrayOutputStream,如果是控制台就是System.out。。。
如果考虑到性能的问题,那么你可以使用缓冲区Buffered。将你的输入流和输出流装饰一下就行了。
回复 使用道具 举报
{:soso_e179:}
回复 使用道具 举报
这个问题可以这样做,前后各写一个System.currentTimeMillis() ;相减就行了。
回复 使用道具 举报
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();               
把数据转到字节数组里面去吗?这样不会报错吗?
按理来说关流以后就不能对流进行操作了才对吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马