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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xuehuayous 中级黑马   /  2014-4-7 10:12  /  1025 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xuehuayous 于 2014-4-8 09:33 编辑

用三种方式复制图片,1,读一个字节写一个字节; 2,自定义缓冲区byte[1024];3.定义字符流缓冲区
问题一、第二种方式复制出来的图片大小竟然不一样?! 但是都能打开。


问题二、复制效率为什么自定义缓冲区比使用字符流缓冲区高,还是我程序有问题


程序如下:
  1. package com.java19;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;

  7. class Java19_11 {
  8.         public static void main(String[] args) {
  9.                
  10.                 //读一个字节写一个字节
  11.                 long start1 = System.currentTimeMillis();
  12.                 pictureCopy_1();
  13.                 long end1 = System.currentTimeMillis();
  14.                 System.out.println("字节读取复制完成,花费时间" + (end1-start1) + "毫秒");
  15.                
  16.                 //自定义缓冲器byte[1024]
  17.                 long start2 = System.currentTimeMillis();
  18.                 pictureCopy_2();
  19.                 long end2 = System.currentTimeMillis();
  20.                 System.out.println("自定义缓冲区复制完成,花费时间" + (end2-start2) + "毫秒");
  21.                
  22.                 //定义字符流缓冲区
  23.                 long start3 = System.currentTimeMillis();
  24.                 pictureCopy_3();
  25.                 long end3 = System.currentTimeMillis();
  26.                 System.out.println("定义字符流缓冲区复制完成,花费时间" + (end3-start3) + "毫秒");
  27.         }
  28.         
  29.         //读一个字节写一个字节
  30.         public static void pictureCopy_1() {
  31.                 FileInputStream fis = null;
  32.                 FileOutputStream fos = null;
  33.                 try {
  34.                         fis = new FileInputStream("E:\\wolf.jpg");
  35.                         fos = new FileOutputStream("E:\\wolf_copy2.jpg");
  36.                         
  37.                         int ch;
  38.                         while((ch=fis.read())!=-1) {
  39.                                 fos.write(ch);
  40.                         }
  41.                 } catch (Exception e) {
  42.                         throw new RuntimeException("图片读取失败!");
  43.                 } finally {
  44.                         try {
  45.                                 if(fis!=null) {
  46.                                         fis.close();
  47.                                 }
  48.                         } catch (IOException e) {
  49.                                 throw new RuntimeException("图片读取关闭失败!");
  50.                         }
  51.                         try {
  52.                                 if(fos!=null) {
  53.                                         fos.close();
  54.                                 }                                
  55.                         } catch (IOException e) {
  56.                                 throw new RuntimeException("图片写入关闭失败!");
  57.                         }
  58.                 }
  59.         }        
  60.         
  61.         //自定义缓冲器byte[1024]
  62.         public static void pictureCopy_2() {
  63.                 FileInputStream fis = null;
  64.                 FileOutputStream fos = null;
  65.                 try {
  66.                         fis = new FileInputStream("E:\\wolf.jpg");
  67.                         fos = new FileOutputStream("E:\\wolf_copy2.jpg");
  68.                                 
  69.                         byte[] buf = new byte[1024];
  70.                         while((fis.read(buf))!=-1) {
  71.                                 fos.write(buf);
  72.                         }
  73.                 } catch (Exception e) {
  74.                         throw new RuntimeException("图片读取失败!");
  75.                 } finally {
  76.                         try {
  77.                                 if(fis!=null) {
  78.                                         fis.close();
  79.                                 }
  80.                         } catch (IOException e) {
  81.                                 throw new RuntimeException("图片读取关闭失败!");
  82.                         }
  83.                         try {
  84.                                 if(fos!=null) {
  85.                                         fos.close();
  86.                                 }                                
  87.                         } catch (IOException e) {
  88.                                 throw new RuntimeException("图片写入关闭失败!");
  89.                         }
  90.                 }
  91.         }
  92.                
  93.         //定义字符流缓冲区
  94.         public static void pictureCopy_3() {
  95.                 BufferedInputStream bufis = null;
  96.                 BufferedOutputStream bufos = null;
  97.                 try {
  98.                         bufis = new BufferedInputStream(new FileInputStream("E:\\wolf.jpg"));
  99.                         bufos = new BufferedOutputStream(new FileOutputStream("E:\\wolf_copy3.jpg"));
  100.                         
  101.                         int by = 0;
  102.                         while((by=bufis.read())!=-1) {
  103.                                 bufos.write(by);
  104.                         }
  105.                 } catch (Exception e) {
  106.                         throw new RuntimeException("图片读取失败!");
  107.                 } finally {
  108.                         try {
  109.                                 if(bufis!=null) {
  110.                                         bufis.close();
  111.                                 }
  112.                         } catch (IOException e) {
  113.                                 throw new RuntimeException("图片读取关闭失败!");
  114.                         }
  115.                         try {
  116.                                 if(bufos!=null) {
  117.                                         bufos.close();
  118.                                 }                                
  119.                         } catch (IOException e) {
  120.                                 throw new RuntimeException("图片写入关闭失败!");
  121.                         }
  122.                 }        
  123.         }
  124. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
本帖最后由 Peach2014 于 2014-4-7 16:09 编辑

package study;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamPicCopy {
public static void main(String[] args) {
        
        //读一个字节写一个字节
        long start1 = System.currentTimeMillis();
        pictureCopy_1();
        long end1 = System.currentTimeMillis();
        System.out.println("字节读取复制完成,花费时间" + (end1-start1) + "毫秒");
        
        //自定义缓冲器byte[1024]
        long start2 = System.currentTimeMillis();
        pictureCopy_2();
        long end2 = System.currentTimeMillis();
        System.out.println("自定义缓冲区复制完成,花费时间" + (end2-start2) + "毫秒");
        
        //定义字符流缓冲区
        long start3 = System.currentTimeMillis();
        pictureCopy_3();
        long end3 = System.currentTimeMillis();
        System.out.println("定义字符流缓冲区复制完成,花费时间" + (end3-start3) + "毫秒");
}
//读一个字节写一个字节
public static void pictureCopy_1() {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
                fis = new FileInputStream("toy.jpg");
                fos = new FileOutputStream("toy1.jpg");
               
                int ch;
                while((ch=fis.read())!=-1) {
                        fos.write(ch);
                }
        } catch (Exception e) {
                throw new RuntimeException("图片读取失败!");
        } finally {
                try {
                        if(fis!=null) {
                                fis.close();
                        }
                } catch (IOException e) {
                        throw new RuntimeException("图片读取关闭失败!");
                }
                try {
                        if(fos!=null) {
                                fos.close();
                        }                                
                } catch (IOException e) {
                        throw new RuntimeException("图片写入关闭失败!");
                }
        }
}        
//自定义缓冲器byte[1024]
public static void pictureCopy_2() {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
                fis = new FileInputStream("toy.jpg");
                fos = new FileOutputStream("toy2.jpg");
                        
                byte[] buf = new byte[1024];
                int len = 0;
       while((len = fis.read(buf)) != -1)
       {
        fos.write(buf, 0, len);//这里修改后,应该就可以解决问题了,我按照你的程序运行,没有发现问题,我个人分析,问题是可能发生
                //读取的和写入的内容不一致,这里对读取长度进行记录,保证了读写一致
       }
//                while((fis.read(buf))!=-1) {
//                        fos.write(buf);
//                }
        } catch (Exception e) {
                throw new RuntimeException("图片读取失败!");
        } finally {
                try {
                        if(fis!=null) {
                                fis.close();
                        }
                } catch (IOException e) {
                        throw new RuntimeException("图片读取关闭失败!");
                }
                try {
                        if(fos!=null) {
                                fos.close();
                        }                                
                } catch (IOException e) {
                        throw new RuntimeException("图片写入关闭失败!");
                }
        }
}
        
//定义字符流缓冲区
public static void pictureCopy_3() {
        BufferedInputStream bufis = null;
        BufferedOutputStream bufos = null;
        try {
                bufis = new BufferedInputStream(new FileInputStream("toy.jpg"));
                bufos = new BufferedOutputStream(new FileOutputStream("toy3.jpg"));
               
                int by = 0;
                while((by=bufis.read())!=-1) {
                        bufos.write(by);
                }
        } catch (Exception e) {
                throw new RuntimeException("图片读取失败!");
        } finally {
                try {
                        if(bufis!=null) {
                                bufis.close();
                        }
                } catch (IOException e) {
                        throw new RuntimeException("图片读取关闭失败!");
                }
                try {
                        if(bufos!=null) {
                                bufos.close();
                        }                                
                } catch (IOException e) {
                        throw new RuntimeException("图片写入关闭失败!");
                }
        }        
}
}

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
fos.write(buf, 0, len);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马