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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马刘杰 于 2013-1-21 11:09 编辑

  1. public static void copyPic(){
  2.   FileInputStream fis=null;
  3.   FileOutputStream fos=null;
  4.   try {
  5.    fis=new FileInputStream("fis.bmp");
  6.    fos=new FileOutputStream("fos.bmp");
  7.    byte[] buf=new byte[1024];
  8.    int len=0;
  9.    while((len=fis.read(buf))!=-1){
  10.     fos.write(buf,0,len);
  11.     fos.flush();//不可以忘记!!!
  12.    }
  13.   } catch (IOException e) {
  14.    e.printStackTrace();
  15.   }finally{
  16.    if(fos!=null){
  17.     try {
  18.      fos.close();
  19.     } catch (IOException e) {
  20.      e.printStackTrace();
  21.     }
  22.    }
  23.    if(fis!=null){
  24.     try {
  25.      fis.close();
  26.     } catch (IOException e) {
  27.      e.printStackTrace();
  28.     }
  29.    }
  30.   }
  31. }

  32. 上面是一个用FileInputStream,和FileOutputStream实现复制图片的方法,如果用BufferedInputStream,BufferedOutputStream该怎么实现呢?

复制代码

点评

建议你去看毕老师io部分,关于缓冲流的视频  发表于 2013-1-21 00:03

4 个回复

倒序浏览
  1. import java.io.*;
  2. class TestCopyPictrue
  3. {
  4.         public static void main(String[] args)  throws IOException
  5.         {
  6.                 copyPic();
  7.         }
  8.         public static void copyPic() throws IOException
  9.         {
  10.                 BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("fis.JPG"));
  11.                 BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("copy_fis.JPG"));
  12.                 int by = 0;
  13.                 while ((by=bufis.read())!=-1)
  14.                 {
  15.                         bufos.write(by);
  16.                 }
  17.                 bufis.close();
  18.                 bufos.close();
  19.         }
  20. }
复制代码
BufferedInputStream和BufferedOutputStream属于装饰类,是为提高操作效率设计的。查看其构造函数,
把fis=new FileInputStream("fis.bmp");和fos=new FileOutputStream("fos.bmp");
作为BufferedInputStream和BufferedOutputStream的参数构造就好了。但要记得关闭资源,bufis.close();
bufos.close();如上代码经过运行通过(异常都抛了)。其实操作的和FileStream一致。

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

回复 使用道具 举报
其实是一样的,这是装饰设计模式,也就是在FileInputStream,和FileOutputStream外面加了一些装饰,内部其实还是他们实现的。
看看API你就会找到BufferedInputStream,BufferedOutputStream他们的构造函数 ,比如说:BufferedOutputStream(OutputStream out)
他构造函数的参数需要传一个输出字节流的对象,那么你传一个他的子类FileOutputStream的对象即可。
其他的使用是完全没有变化的。
至于说原理,前面已经说了,其实就是一个包装而已,至于说缓存,其实就跟你上面代码里面使用数组缓存一个道理,sun公司的工程师也想到了这个方式,添加了一些缓存。
如果你想深一步的了解,可以去看看原码。

评分

参与人数 1黑马币 +9 收起 理由
黄锦成 + 9

查看全部评分

回复 使用道具 举报
  1. import java.io.*;

  2. public class CopyPicture {
  3.        
  4.         public static void main(String[] args) {
  5.                 copyPic();
  6.         }
  7.        
  8.         public static void copyPic() {
  9.                 FileInputStream fis = null;
  10.                 FileOutputStream fos = null;
  11.                 try {
  12.                         fis = new FileInputStream("psb.jpg");
  13.                         BufferedInputStream bi = new BufferedInputStream(fis);
  14.                         fos = new FileOutputStream("psb1.jpg");
  15.                         BufferedOutputStream bo = new BufferedOutputStream(fos);
  16.                         byte[] b = new byte[1024];
  17.                         int leng;
  18.                         while((leng = bi.read(b, 0, b.length)) != -1) {
  19.                                 bo.write(b, 0, leng);
  20.                                 bo.flush();
  21.                         }
  22. /*                        byte[] buf = new byte[1024];
  23.                         int len = 0;
  24.                         while ((len = fis.read(buf)) != -1) {
  25.                                 fos.write(buf, 0, len);
  26.                                 fos.flush();// 不可以忘记!!!
  27.                         }*/
  28.                 } catch (IOException e) {
  29.                         e.printStackTrace();
  30.                 } finally {
  31.                         if (fos != null) {
  32.                                 try {
  33.                                         fos.close();
  34.                                 } catch (IOException e) {
  35.                                         e.printStackTrace();
  36.                                 }
  37.                         }
  38.                         if (fis != null) {
  39.                                 try {
  40.                                         fis.close();
  41.                                 } catch (IOException e) {
  42.                                         e.printStackTrace();
  43.                                 }
  44.                         }
  45.                 }
  46.         }
  47. }
复制代码
在此我认为我有必要说明一下 FileInputStream 和 BufferedInputStream中的read方法的区别
FileInputStream 是从硬盘上一个字节,一个字节的读取,速度相当的慢,但是如果在外面套一层BufferedInputStream,因为BufferedInputStream内部有一个缓冲区,首先
读取一次数据,将缓冲区填满,之后直接从缓冲区中读取数据,这样cpu访问硬盘的次数下降了好多,效率就提高了许多倍FileOutputStream和BufferedOutputStream是同样的道理

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1 赞一个!

查看全部评分

回复 使用道具 举报
vmvm555 发表于 2013-1-20 23:08
在此我认为我有必要说明一下 FileInputStream 和 BufferedInputStream中的read方法的区别
FileInputStream  ...

  while((leng = bi.read(b, 0, b.length)) != -1)  写成   while((leng = bi.read(b) != -1)就行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马